मार्टिन आर के जवाब
addressOf() के अनुसार struct चर के साथ नहीं किया जा सकता। स्ट्रिंग एक संरचना है, हालांकि, किसी ऑब्जेक्ट की अपेक्षा करने वाले फ़ंक्शन पर पारित होने पर यह स्वचालित रूप से एनएसएसटींग को ब्रिज किया जाता है।
nschum के जवाब के अनुसार, यदि आप एक struct की (ढेर) पता प्राप्त कर सकते हैं, निर्माण में इस तरह के प्रकार या वस्तु संदर्भ:
import UIKit
func address(o: UnsafePointer<Void>) -> Int {
return unsafeBitCast(o, Int.self)
}
func addressHeap<T: AnyObject>(o: T) -> Int {
return unsafeBitCast(o, Int.self)
}
struct myStruct {
var a: Int
}
class myClas {
}
//struct
var struct1 = myStruct(a: 5)
var struct2 = struct1
print(NSString(format: "%p", address(&struct1))) // -> "0x10f1fd430\n"
print(NSString(format: "%p", address(&struct2))) // -> "0x10f1fd438\n"
//String
var s = "A String"
var aa = s
print(NSString(format: "%p", address(&s))) // -> "0x10f43a430\n"
print(NSString(format: "%p", address(&aa))) // -> "0x10f43a448\n"
//Class
var class1 = myClas()
var class2 = class1
print(NSString(format: "%p", addressHeap(class1))) // -> 0x7fd5c8700970
print(NSString(format: "%p", addressHeap(class2))) // -> 0x7fd5c8700970
unsafeAddressOf(class1) //"UnsafePointer(0x7FD95AE272E0)"
unsafeAddressOf(class2) //"UnsafePointer(0x7FD95AE272E0)"
//Int
var num1 = 55
var num2 = num1
print(NSString(format: "%p", address(&num1))) // -> "0x10f1fd480\n"
print(NSString(format: "%p", address(&num2))) // -> "0x10f1fd488\n"
एक बात मैं है पाया, अगर myStruct
कोई मूल्य नहीं है, पता ही बनाए रखने की जाएगी:
struct myStruct {
}
var struct1 = myStruct()
var struct2 = struct1
print(NSString(format: "%p", address(&struct1))) // -> ""0xa000000000070252\n""
print(NSString(format: "%p", address(&struct2))) // -> ""0xa000000000070252\n""
तो यह साबित करता है कि स्विफ्ट कस्टम Structs के लिए कॉपी-ऑन-राइट अनुकूलन को लागू नहीं करता है, केवल कुछ ही में बनाया के लिए प्रकार और कक्षाएं। दिलचस्प। –
@karansatia कक्षाएं संदर्भ प्रकार हैं, इसलिए उन्हें असाइनमेंट पर कॉपी नहीं किया गया है। यदि आप किसी अन्य ऑब्जेक्ट को क्लास इंस्टेंस आवंटित करते हैं, तो वे उसी ऑब्जेक्ट को इंगित करेंगे। इसलिए यह सामान्य है कि ऊपर दिए गए उदाहरण में हमारे पास दोनों वर्गों के लिए एक ही पता है। कॉपी-ऑन-राइट के साथ इसका कोई लेना-देना नहीं है। यह सच है कि वे अंतर्निहित या कस्टम कक्षाएं हैं या नहीं। आपको अपनी कक्षा को क्लोन करने योग्य बनाने के लिए एनएससीपीआईपी लागू करना होगा, और इसे इस तरह असाइन करना होगा: बी = a.copy() के रूप में? MyClass बल्कि फिर बी = ए –