如何在 Swift 3 中向 CNMutableContact 添加新电子邮件?
How to add new email to CNMutableContact in Swift 3?
很快 .. 我有这个代码来添加新联系人,它一直有效直到将我的代码转换为 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]
有什么帮助吗?
在Swift3中,CNLabeledValue
声明为:
public class CNLabeledValue<ValueType : NSCopying, NSSecureCoding> : NSObject, NSCopying, NSSecureCoding {
//...
}
你需要让Swift能够推断出符合NSCopying
和NSSecureCoding
的ValueType
。
不幸的是,String
或 String?
都不符合它们。
并且,Swift3 去掉了一些隐式的类型转换,比如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]
}
对于 Swift 3 和 ios >= 9.0
您可以使用方法 CNContact mutableCopy
func saveVCardContacts (vCard : Data) {
if #available(iOS 9.0, *) {
let contactStore = CNContactStore()
do {
let saveRequest = CNSaveRequest()
let contacts = try CNContactVCardSerialization.contacts(with: vCard)
var mutablePerson: CNMutableContact
for person in contacts{
mutablePerson = person.mutableCopy() as! CNMutableContact
saveRequest.add(mutablePerson, toContainerWithIdentifier: nil)
}
try contactStore.execute(saveRequest)
} catch {
print("Unable to show the new contact")
}
}else{
print("CNContact not supported.")
}
}
let workemail = "" //Your Input goes here
let WorkEmail = CNLabeledValue(label:CNLabelWork, value: workmail as NSString)
contact.emailAddresses = [WorkEmail]
对于Swift 3
Swift 3:电子邮件和Phone条目
文档:https://developer.apple.com/reference/contacts
let workPhoneEntry : String = "(408) 555-0126"
let workEmailEntry : String = "test@apple.com"
let workEmail = CNLabeledValue(label:CNLabelWork, value:workEmailEntry as NSString)
contact.emailAddresses = [workEmail]
contact.phoneNumbers = [CNLabeledValue(
label:CNLabelPhoneNumberMain,
value:CNPhoneNumber(stringValue:workPhoneEntry))]
很快 .. 我有这个代码来添加新联系人,它一直有效直到将我的代码转换为 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]
有什么帮助吗?
在Swift3中,CNLabeledValue
声明为:
public class CNLabeledValue<ValueType : NSCopying, NSSecureCoding> : NSObject, NSCopying, NSSecureCoding {
//...
}
你需要让Swift能够推断出符合NSCopying
和NSSecureCoding
的ValueType
。
不幸的是,String
或 String?
都不符合它们。
并且,Swift3 去掉了一些隐式的类型转换,比如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]
}
对于 Swift 3 和 ios >= 9.0
您可以使用方法 CNContact mutableCopy
func saveVCardContacts (vCard : Data) {
if #available(iOS 9.0, *) {
let contactStore = CNContactStore()
do {
let saveRequest = CNSaveRequest()
let contacts = try CNContactVCardSerialization.contacts(with: vCard)
var mutablePerson: CNMutableContact
for person in contacts{
mutablePerson = person.mutableCopy() as! CNMutableContact
saveRequest.add(mutablePerson, toContainerWithIdentifier: nil)
}
try contactStore.execute(saveRequest)
} catch {
print("Unable to show the new contact")
}
}else{
print("CNContact not supported.")
}
}
let workemail = "" //Your Input goes here
let WorkEmail = CNLabeledValue(label:CNLabelWork, value: workmail as NSString)
contact.emailAddresses = [WorkEmail]
对于Swift 3
Swift 3:电子邮件和Phone条目
文档:https://developer.apple.com/reference/contacts
let workPhoneEntry : String = "(408) 555-0126"
let workEmailEntry : String = "test@apple.com"
let workEmail = CNLabeledValue(label:CNLabelWork, value:workEmailEntry as NSString)
contact.emailAddresses = [workEmail]
contact.phoneNumbers = [CNLabeledValue(
label:CNLabelPhoneNumberMain,
value:CNPhoneNumber(stringValue:workPhoneEntry))]