如何在 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能够推断出符合NSCopyingNSSecureCodingValueType

不幸的是,StringString? 都不符合它们。

并且,Swift3 去掉了一些隐式的类型转换,比如StringNSString,需要显式转换。

请试试这个:

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))]