Zizoo Zizoo - 2 months ago 90
Swift Question

How to add new email to CNMutableContact in Swift 3?

Quickly .. I have this code to add new contact , it was working until converting my code to Swift 3 , now it accept all properties except the email I get two errors :


1-Argument type 'String?' does not conform to expected type
'NSCopying'

2-Argument type 'String?' does not conform to expected type
'NSSecureCoding'


this is my code when I try to add email to contact :

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


any help ?

Answer

In Swift 3, CNLabeledValue is declared as:

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

You need to make Swift able to infer the ValueType, which conforms to NSCopying and NSSecureCoding.

Unfortunately, String or String? does not conform to neither of them.

And, Swift 3 removed some implicit type conversions, such as String to NSString, you need to cast it explicitly.

Please try this:

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

Or this:

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

(Maybe the latter is the better, you should not make an empty entry.)

Comments