很快 .. 我有这段代码可以添加新联系人,它一直有效,直到将我的代码转换为 Swift 3,现在它接受除电子邮件之外的所有属性,我收到两个错误:
1-Argument type 'String?' does not conform to expected type 'NSCopying'
2-Argument type 'String?' does not conform to expected type 'NSSecureCoding'
这是我尝试向联系人添加电子邮件时的代码:
let workEmail = CNLabeledValue(label:"Work Email", value:emp.getEmail())
contact.emailAddresses = [workEmail]
有什么帮助吗?
最佳答案
在 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]
}
关于ios - 如何在 Swift 3 中向 CNMutableContact 添加新电子邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39648830/