Zizoo Zizoo - 28 days ago 26x
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

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

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 ?


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