2017-04-23 24 views
8

Theo tài liệu Swift 3, NSNumber được bắc cầu với các kiểu gốc Swift như Int, Float, Double, ... Nhưng khi tôi thử sử dụng kiểu gốc trong Từ điển tôi nhận được lỗi biên dịch được cố định khi sử dụng NSNumber, tại sao vậy? Đây là mã của tôi:NSNumber vs Int, Float trong từ điển Swift

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

và trình biên dịch đưa ra lỗi "Không thể gán giá trị kiểu Float cho AnyObject". Nếu tôi viết mã như sau, không có vấn đề gì vì NSNumber thực sự là một kiểu đối tượng.

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

Swift trình biên dịch cũng nhắc nhở để sửa chữa các mã như

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

nhưng tôi không chắc chắn nếu nó là điều đúng để làm hay không. Nếu thực sự có một cầu nối giữa NSNumber và các kiểu bản địa (Int, Float, vv), tại sao trình biên dịch buộc phải định kiểu cho AnyObject?

+0

liên quan: http://stackoverflow.com/questions/39321421/working-with-nsnumber-integer-values-in-swift- 3 –

Trả lời

6

Các loại nguyên thủy như Float, Int, Double được định nghĩa là struct để chúng không thực hiện giao thức AnyObject. Thay vào đó, Any thể đại diện cho một thể hiện của bất kỳ loại nào cả nên loại của từ điển của bạn nên là:

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

Bên cạnh đó, trong mã của bạn khi bạn làm:

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

Float được chuyển đổi sang NSNumber ngầm và sau đó được upcasted đến AnyObject. Bạn có thể chỉ cần thực hiện as NSNumber để tránh cái sau.

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 

nếu bạn thực sự muốn AnyObject như một giá trị

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