2017-04-23 3 views
8

Swift 3 설명서에 따르면 NSNumber는 Int, Float, Double 등의 Swift 기본 유형에 연결됩니다. 그러나 사전에서 기본 유형을 사용하려고하면 컴파일 오류가 발생합니다. NSNumber를 사용하면 문제가 해결됩니다. 그 이유는 무엇입니까? 여기 내 코드입니다 :NSNumber 대 Int, Swift 사전의 부동

var dictionary:[String : AnyObject] = [:] 
dictionary["key"] = Float(1000) 

및 컴파일러는 "AnyObject에 Float 형의 값을 할당 할 수 없습니다"오류를 제공합니다. 다음과 같이 코드를 작성하면 NSNumber가 실제로 객체 유형이므로 아무런 문제가 없습니다.

dictionary["key"] = NSNumber(value:Float(1000)) 

스위프트 컴파일러는

dictionary["key"] = Float(1000) as AnyObject 

로 코드를 수정하라는 메시지 만이 할 여부를 위해 올바른 일이 있는지 확실하지 않다. 실제로 NSNumber와 기본 유형 (Int, Float 등) 사이에 브리징이있는 경우 컴파일러 강제로 AnyObject로 유형 변환 할 수 있습니까?

+0

관련 : http://stackoverflow.com/questions/39321421/working-with-nsnumber-integer-values-in-swift- 삼 –

답변

6

원시적 인 형태의 Float처럼 IntDouble는 그래서 그들은 AnyObject 프로토콜을 구현하지 않는 struct로 정의됩니다. 대신, Any 전혀 있으므로 사전의 형식이 있어야 할 형식의 인스턴스를 나타낼 수

var dictionary: [String: Any] = [:] 

를 그 외에도에서, 코드에서 당신이 할 때

dictionary["key"] = Float(1000) as AnyObject 

Float이 암시 적으로 NSNumber로 변환됩니다 그러면 AnyObject으로 업 캐스팅됩니다. 후자를 피하려면 방금 as NSNumber을 수행 할 수 있습니다.

1
import Foundation 

var dictionary:[String : NSNumber] = [:] 
dictionary["key1"] = 1000.0 
dictionary["key2"] = 100 

let i = 1 
let d = 1.0 

dictionary["key3"] = i as NSNumber 
dictionary["key4"] = d as NSNumber 

당신이 정말로 값으로 AnyObject을 좋아하면

import Foundation 

var dictionary:[String : AnyObject] = [:] 

dictionary["key1"] = 1000.0 as NSNumber 
dictionary["key2"] = 100 as NSNumber 

let i = 1 
let d = 1.0 

dictionary["key3"] = i as NSNumber 
dictionary["key4"] = d as NSNumber