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

Ziz*_*zoo 13 ios swift cncontact

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

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

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

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

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

任何帮助?

OOP*_*Per 32

在Swift 3中,CNLabeledValue声明为:

public class CNLabeledValue<ValueType : NSCopying, NSSecureCoding> : NSObject, NSCopying, NSSecureCoding {
    //...
}
Run Code Online (Sandbox Code Playgroud)

你需要让Swift能够推断出ValueType符合NSCopyingNSSecureCoding.

不幸的是,String或者String?不符合他们两者.

而且,斯威夫特3去掉了一些隐式类型转换,比如StringNSString,你需要明确地投它.

请试试这个:

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

或这个:

if let email = emp.getEmail() {
    let workEmail = CNLabeledValue(label:"Work Email", value:email as NSString)
    contact.emailAddresses = [workEmail]
}
Run Code Online (Sandbox Code Playgroud)

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

还有一个,正如Cesare所建议的那样,你最好CNLabel...尽可能使用标签之类的预定义常量:

if let email = emp.getEmail() {
    let workEmail = CNLabeledValue(label: CNLabelWork, value: email as NSString)
    contact.emailAddresses = [workEmail]
}
Run Code Online (Sandbox Code Playgroud)

  • 最好使用 `CNLabelWork` 而不是“工作电子邮件”,因为前者已在每种语言中进行了本地化 (2认同)

9Ba*_*nap 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))]
Run Code Online (Sandbox Code Playgroud)