var currentContact = CNLabeledValue<NSCopying & NSSecureCoding>()
我想创建一个变量来存储联系人的值,该值可以是电话号码或电子邮件地址
var currentContact = CNLabeledValue<NSCopying & NSSecureCoding>()
currentContact = self.itemsInAcontact[section][0] as! CNLabeledValue
if ((currentContact.value as? CNPhoneNumber) != nil){
phoneNumber = currentContact.value as! CNPhoneNumber
if let y = phoneNumber?.value(forKey: "initialCountryCode"){
cell.nameLabel!.text = "\(phoneNumber!.value(forKey: "initialCountryCode") as! String)\(phoneNumber!.stringValue)"
}else{
cell.nameLabel!.text = "\(phoneNumber!.stringValue)"
}
}else{
cell.nameLabel!.text = currentContact.value as! String
}
在这里,我试图在表格视图的单元格内显示无名类型联系人中可用的联系电话或电子邮件地址,但是在声明var currenctContact
时出现错误
错误消息:“'NSCopying&NSSecureCoding'不能用作符合协议'NSSecureCoding'的类型,因为'NSSecureCoding'具有静态要求”。
答案 0 :(得分:0)
LabeledValue是通用的。两种不同的LabeledValue类型(即,以两种不同方式解析的同一个泛型CNLabeledValue<NSString>
和CNLabeledValue<CNPhoneNumber>
)是不同的类型,无法存储在公共属性中。这与[Int]
和[String]
是两个不同的类型(即使它们都是数组)也没什么不同。
在单个属性中存储两种不同LabeledValue类型的唯一方法是将该属性键入为AnyObject。因此,这可行:
var currentContact : AnyObject? = nil
let phoneNumber = CNPhoneNumber(stringValue: "1234567890")
let labelled = CNLabeledValue(label: "yoho", value: phoneNumber)
currentContact = labelled
let email = CNLabeledValue(label: "hoha", value: "mickey@mouse.com" as NSString)
currentContact = email
但是,我不建议您这样做。相反,由于您真正需要的只是一个字符串,因此将currentContact
标记为一个包装NSString的值:
var currentContact : CNLabeledValue<NSString>? = nil
您可以将电子邮件CNLabeledValue直接存储到其中。对于电话号码,请从电话号码的字符串值中形成一个新的标签值:
currentContact = CNLabeledValue(
label:phone.label, value:phone.value.stringValue as NSString)
答案 1 :(得分:0)
好像Apple在XCode 10.2中的NSSecureCoding上做了一些更改,但我找不到任何详细信息。
因此,现在,您应该从NSCopying&NSSecureCoding更改为NSString
var currentContact = CNLabeledValue<NSString>()