如何在Swift 3中向CNMutableContact添加新邮件?

时间:2016-09-22 21:03:24

标签: ios swift cncontact

很快..我有这个代码添加新的联系人,它一直在工作,直到我的代码转换为Swift 3,现在它接受所有属性,除了电子邮件,我得到两个错误:

  

1-Argument type'String?'不符合预期的类型   'NSCopying'

     

2-Argument type'String?'不符合预期的类型   'NSSecureCoding'

当我尝试向联系人添加电子邮件时,这是我的代码:

    let workEmail = CNLabeledValue(label:"Work Email", value:emp.getEmail())
    contact.emailAddresses = [workEmail]

任何帮助?

4 个答案:

答案 0 :(得分:30)

在Swift 3中,CNLabeledValue被声明为:

public class CNLabeledValue<ValueType : NSCopying, NSSecureCoding> : NSObject, NSCopying, NSSecureCoding {
    //...
}

您需要让Swift能够推断出符合ValueTypeNSCopying的{​​{1}}。

不幸的是,NSSecureCodingString不符合这两者。

并且,Swift 3删除了一些隐式类型转换,例如String?String,您需要明确地转换它。

请试试这个:

NSString

或者这个:

let workEmail = CNLabeledValue(label:"Work Email", value:(emp.getEmail() ?? "") as NSString)
contact.emailAddresses = [workEmail]

(也许后者更好,你不应该做空的。)

另外,正如Cesare所建议的那样,你最好尽可能使用预定义的常量,如if let email = emp.getEmail() { let workEmail = CNLabeledValue(label:"Work Email", value:email as NSString) contact.emailAddresses = [workEmail] } 标签:

CNLabel...

答案 1 :(得分:6)

Swift 3 :电子邮件和电话条目

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

答案 2 :(得分:2)

 let workemail = "" //Your Input goes here
 let WorkEmail = CNLabeledValue(label:CNLabelWork, value: workmail as NSString)
 contact.emailAddresses = [WorkEmail]

对于Swift 3

答案 3 :(得分:-1)

代表Swift 3,ios&gt; = 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.")
    }
}