我有一个像这样的数组:
var array: [(NSDate?, NSData?)] = []
当我像这样使用它时:
array.append(NSDate(), nil)
编译器提供错误accessing members of protocol type value 'NSData' is unimplemented
我不明白这个错误,它应该正常吗?
答案 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?)