奇怪的可选元组数组行为

时间:2015-03-06 13:13:09

标签: swift

我有一个像这样的数组:

var array: [(NSDate?, NSData?)] = []

当我像这样使用它时:

array.append(NSDate(), nil)

编译器提供错误accessing members of protocol type value 'NSData' is unimplemented

我不明白这个错误,它应该正常吗?

2 个答案:

答案 0 :(得分:4)

将nil作为参数传递时,很难确定swift中提供的元组类型,因此必须将其转换为正确的类型。

var array: [(NSDate?, NSData?)] = []
array.append((NSDate(), nil) as (NSDate?, NSData?))

let t : (NSDate?, NSData?) = (NSDate(), nil)
array.append(t)

答案 1 :(得分:1)

Swift并不支持这样的转换:

let a:(String, Int?) = ("test", 1)
let b:(String?, Int?) = a
//                      ^ error: cannot express tuple conversion '(String, Int?)' to '(String?, Int?)'

元组类型必须与目标类型完全匹配。

但是,在您的情况下,它可以被视为一个错误。因为这有效:

func foo(x:(NSDate?, NSData?)) { println(x) }
foo((NSDate(), nil))

但这并不是:

struct Foo<T> {
    func foo(x:T) { println(x) }
}

var f = Foo<(NSDate?, NSData?)>()
f.foo((NSDate(), nil))

解决方法是:

array.append((NSDate(), nil) as (NSDate?, NSData?))
// OR
array.append((NSDate() as NSDate?, nil as NSData?))
// OR
array.append(NSDate() as NSDate?, nil as NSData?)
相关问题