0

나는 다음과 같은 사전이 있습니다스위프트 3에서 사전을 NSValue로 나타내는 방법은 무엇입니까?

let example: [String: (Int, Int)] = ["test": (0, 1)] 

가 내가있는 NSData 변수로이 저장하고, 그것은 처음에는 다음과 같이 수행하려고 NSValue로 변환되어야 함을 할 필요가 :

let nsval = NSValue().getValue(example as! UnsafeMutableRawPointer) 

은 오류와 함께 충족되어야합니다 :

:

Cannot convert value of type 'Void' (aka '()') to specified type 'NSValue'

나는 SO 사용하는 것이 좋습니다 답변을 보았다

let test = UnsafeMutablePointer.load(example) 

하지만 그 또한 오류 산출 : 그럼

Type 'UnsafeMutablePointer<_>' has no member 'load'

, 어떻게 하나 스위프트 3에 NSValue에 사전을 변환된다?

답변

1

이론적으로, 신속하게 튜플을 데이터 객체로 바꾸려면이 작업을 수행 할 수 있습니다.

var x:(Int, Int) = (4, 2) 

var bytes:Data = withUnsafeBytes(of: &x){ g in 
    var d = Data() 
    for x in g { 
     d.append(x) 
    } 

    return d 
} 

heres는 역방향 :

var y:(Int, Int) = (0,0) 
bytes.withUnsafeBytes { (x:UnsafePointer<(Int, Int)>) in 
    y = x.pointee 
} 

print(y) // prints (4, 2) 

을주의 :이 어둠의 경로이다.

2

모든 빠른 유형이 Foundation 클래스와 호환되는 것은 아닙니다. 그래서 당신은 타입 [String: (Int, Int)]을 포함하는 NSValue를 만들 수 없습니다.하지만 NSDictionary로 시작할 수 있습니다. 튜플을 버리고 objc와 호환되는 유형을 선택하십시오. let example:의 유형을 NSDictionary로 변경할 수 있습니다. NSValue 메서드를 사용하십시오. 그들은 여전히 ​​지원하지 않습니다하지만 당신은 일반적으로 직렬화 목적을 위해있는 NSData로 일반 objc 유형을 설정하려는 경우 말했다

, 당신은 ( .archivedData(withRootObject: Any) -> Data처럼 NSKeyedArchiver/ NSKeyedUnarchiver 방법에서 더 많은 사용량을받을거야 튜플.)

+0

그렇다면 NSUbiquitousKeyValueStore에 튜플을 저장할 방법이 절대적으로 없나요? –

+0

코드 예제가 너무 깁니다. 두 번째 대답 참조 –

관련 문제