在 Swift 3 中,CNLabeledValue 被声明为:
public class CNLabeledValue<ValueType : NSCopying, NSSecureCoding> : NSObject, NSCopying, NSSecureCoding {
//...
}
你需要让 Swift 能够推断出ValueType,它符合NSCopying 和NSSecureCoding。
很遗憾,String 或 String? 都不符合它们。
而且,Swift 3 移除了一些隐式类型转换,例如 String 到 NSString,您需要显式转换。
请试试这个:
let workEmail = CNLabeledValue(label:"Work Email", value:(emp.getEmail() ?? "") as NSString)
contact.emailAddresses = [workEmail]
或者这个:
if let email = emp.getEmail() {
let workEmail = CNLabeledValue(label:"Work Email", value:email as NSString)
contact.emailAddresses = [workEmail]
}
(也许后者更好,你不应该做空条目。)
另外,正如 Cesare 所建议的,您最好尽可能使用预定义的常量,例如 CNLabel... 作为标签:
if let email = emp.getEmail() {
let workEmail = CNLabeledValue(label: CNLabelWork, value: email as NSString)
contact.emailAddresses = [workEmail]
}