2016-05-23 3 views
7

मैं कैसे स्विफ्ट copies value types की एक गहरी समझ हासिल करने के लिए कोशिश कर रहा हूँ:मैं एक मूल्य प्रकार का स्मृति पता या स्विफ्ट में कस्टम स्ट्रक्चर कैसे प्राप्त कर सकता हूं?

व्यवहार अपने कोड में आप देख हमेशा रहेंगे, जैसे कि एक प्रति जगह ले ली। हालांकि, स्विफ्ट केवल दृश्यों के पीछे एक वास्तविक प्रतिलिपि करता है जब ऐसा करने के लिए बिल्कुल जरूरी है।

मेरी समझ को आगे बढ़ाने के लिए, मैं एक मान प्रकार का स्मृति पता प्राप्त करना चाहता हूं। मैंने unsafeAddressOf(), लेकिन this doesn't work with structs and it seems to cast Swift's standard library types to reference types (उदाहरण के लिए स्ट्रिंग को एनएसएसटींग में डाला गया है) की कोशिश की।

मैं मूल्य प्रकार का स्मृति पता कैसे प्राप्त कर सकता हूं, जैसे इंट के उदाहरण, या स्विफ्ट में कस्टम स्ट्रक्चर?

उत्तर

12

मार्टिन आर के जवाब

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"" 
+0

तो यह साबित करता है कि स्विफ्ट कस्टम Structs के लिए कॉपी-ऑन-राइट अनुकूलन को लागू नहीं करता है, केवल कुछ ही में बनाया के लिए प्रकार और कक्षाएं। दिलचस्प। –

+0

@karansatia कक्षाएं संदर्भ प्रकार हैं, इसलिए उन्हें असाइनमेंट पर कॉपी नहीं किया गया है। यदि आप किसी अन्य ऑब्जेक्ट को क्लास इंस्टेंस आवंटित करते हैं, तो वे उसी ऑब्जेक्ट को इंगित करेंगे। इसलिए यह सामान्य है कि ऊपर दिए गए उदाहरण में हमारे पास दोनों वर्गों के लिए एक ही पता है। कॉपी-ऑन-राइट के साथ इसका कोई लेना-देना नहीं है। यह सच है कि वे अंतर्निहित या कस्टम कक्षाएं हैं या नहीं। आपको अपनी कक्षा को क्लोन करने योग्य बनाने के लिए एनएससीपीआईपी लागू करना होगा, और इसे इस तरह असाइन करना होगा: बी = a.copy() के रूप में? MyClass बल्कि फिर बी = ए –

3

मुझे यकीन है कि हो, तो एक "सुझाए गए" ऐसा करने के लिए जिस तरह से नहीं कर रहा हूँ, लेकिन एक विधि withUnsafePointer(_:_:) उपयोग करने के लिए, इस तरह है:

var s: String = "foo" 
withUnsafePointer(&s) { NSLog("\($0)") } 

यह मेरा मशीन पर मुद्रित 0x00007ffff52a011c8

6

स्विफ्ट 2.0:

,210

आप उपयोग कर सकते हैं इस unsafeAddressOf(someObject)

या स्विफ्ट 3.0 में:

उपयोग withUnsafePointer(to: someObejct) { print("\($0)") }

संबंधित मुद्दे

 संबंधित मुद्दे