Получение ошибки CNLabeledValue "NSCopying & NSSecureCoding" не может быть в Xcode 10.2, а не в Xcode 10.1 - PullRequest
0 голосов
/ 12 апреля 2019
var currentContact = CNLabeledValue<NSCopying & NSSecureCoding>()

Я хочу создать переменную, которая будет хранить значение из контакта, который может быть либо номером телефона, либо адресом электронной почты

var currentContact = CNLabeledValue<NSCopying & NSSecureCoding>()
currentContact = self.itemsInAcontact[section][0] as! CNLabeledValue


if ((currentContact.value as? CNPhoneNumber) != nil){
    phoneNumber = currentContact.value as! CNPhoneNumber

    if let y = phoneNumber?.value(forKey: "initialCountryCode"){
        cell.nameLabel!.text = "\(phoneNumber!.value(forKey: "initialCountryCode") as! String)\(phoneNumber!.stringValue)"
    }else{
        cell.nameLabel!.text = "\(phoneNumber!.stringValue)"
    }
}else{
    cell.nameLabel!.text = currentContact.value as! String
}

Здесь я пытаюсь отобразить номер контакта или адрес электронной почты, доступные в контакте без имени типа, в ячейке таблицы, но получаю сообщение об ошибке при объявлении var currenctContact

Сообщение об ошибке: «NSCopying & NSSecureCoding» не может использоваться как тип, соответствующий протоколу «NSSecureCoding», поскольку «NSSecureCoding» имеет статические требования ».

Ответы [ 2 ]

0 голосов
/ 13 апреля 2019

Похоже, Apple что-то изменила в NSSecureCoding в XCode 10.2, но я пока не могу найти какие-либо подробности.

Итак, на данный момент вы должны перейти с NSCopying & NSSecureCoding на NSString

var currentContact = CNLabeledValue<NSString>()
0 голосов
/ 12 апреля 2019

LabeledValue является универсальным. Два разных типа LabeledValue (то есть один и тот же общий тип, разрешенный двумя разными способами, CNLabeledValue<NSString> и CNLabeledValue<CNPhoneNumber>) являются разными типами и не могут храниться в общем свойстве. Это ничем не отличается от того факта, что [Int] и [String] - это два разных типа, даже если они оба являются массивами.

Единственный способ сохранить два разных типа LabeledValue в одном свойстве - это ввести это свойство как AnyObject. Таким образом, это работает:

var currentContact : AnyObject? = nil

let phoneNumber = CNPhoneNumber(stringValue: "1234567890")
let labelled = CNLabeledValue(label: "yoho", value: phoneNumber)
currentContact = labelled

let email = CNLabeledValue(label: "hoha", value: "mickey@mouse.com" as NSString)
currentContact = email

Однако я не рекомендую это делать. Вместо этого, поскольку все, что вам действительно нужно, это строка, сделайте ваше currentContact помеченным значением, заключающим NSString:

var currentContact : CNLabeledValue<NSString>? = nil

Вы можете сохранить электронную почту CNLabeledValue непосредственно в нее. Для номера телефона введите новое значение с меткой из строкового значения номера телефона:

currentContact = CNLabeledValue(
    label:phone.label, value:phone.value.stringValue as NSString)
...