2016-07-12 3 views
4

NSData으로 개체를 변환하려면 NSKeyedArchiver.archivedDataWithRootObject(obj)을 사용합니다. archivedDataWithRootObject(obj) 메서드는 해당 매개 변수가 을 따르는 NSObject이어야합니다.Swift의 문자열, 배열 및 사전 NSObject입니까? 구조체가 NSObject 일 수있는 이유는 무엇입니까?

스위프트 String s, Array s 및 Dictionary s를 보관 해 보았는데 제대로 작동했습니다. 그래서 나는 StringNSCoding을 따르는 NSObject이라고 생각합니다.

는 또한 StringNSObject 것을 확인하기 위해, 놀이터에서이 코드를 검사 :

var str = "Hello, playground" 
let isObject = (str is NSObject) // isObject is true 

하지만 (Cmd를가 + 클릭으로) String의 정의를 탐색 할 때, 그것은 String이를 것을 보여준다 struct. StringNSObject이라는 코드를 찾을 수 없습니다.

public struct String { 
    /// An empty `String`. 
    public init() 
} 

그럼, 왜 String 정의에, 나는 코드가 StringNSObject 것을 보여주는 찾을 수 없습니다? 왜 struct가 NSObject이 될 수 있습니까?

답변

4

String, Array, Dictionary는 모든 목표 - C 대응 (NSString, NSArrayNSDictionary)에 다리를하고 원활과 같이 작동 할 수 있습니다.

문자열 자체는 NSObject에서 상속받지 않으며 실제로 구조체이지만 NSString에서 연결됩니다. 코드에서 String을 사용하면 NSString처럼 작동하여 제공 한 코드의 결과를 얻을 수 있습니다.

+0

설명해 주셔서 감사합니다. 신속한 String 구조체가했던 것처럼 NSString에 연결되는 MyString 구조체를 어떻게 만들 수 있습니까? – huync

+1

@huync 그 행동은 신속한 언어에 내장되어 있습니다. 구조체를 직접 만들고 구조체를 NSString으로 연결할 수는 없을 것입니다 ... 만약 당신이 원하는 이유가 'NSKeyedArchiver'를 사용할 수 있다면 간단히 클래스를 만드는 것이 더 낫습니다. NSString이나 NSObject로부터 상속받은 것 –

+1

@BlakeLockley NSString과 String 같은 타입 사이에서 어떻게 브리징이 이루어지는 지에 대한 지식을 얻으려는 모든 자료가 있습니까? 그것과 관련된 기술적 인 과정처럼? +1. –