Общая функция с типами CNLabeledValue - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь реорганизовать некоторый код обработки CNContact, чтобы упростить его управление и чтение.

CNContact использует CNLabeled<ValueType>, где ValueType может быть CNPhoneNumber, NSString, CNPostalAddress, NSString, CNSocialProfile, CNInstantMessageAddressNSDateComponents

В идеале мне нужна одна универсальная функция, которая принимает эти типы в виде строк или типов и возвращает метку и значение из моего CNContact объекта.Это для CollectionView

Я думал об использовании вычисляемой переменной, которая возвращает тип в зависимости от того, в каком разделе я использую перечисление или функцию.Затем, используя эту переменную, я могу создать универсальную функцию, которая возвращает соответствующие данные

    private func getDetails<T>(labeledValueType:T.Type, with key:String, from contact:CNContact) -> CNLabeledValue<T>?{
    guard let contactDetails = contact.value(forKey: key) as? [CNLabeledValue<T>] else{
        assertionFailure("can't get detail")
        return nil
    }
    return contactDetails
}

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

Вот примерперечисления, но это возвращает Any как тип, перенастроенный вместо связанного типа

var sectionType: Any? {
        switch self {
        case .PhoneNumbers:
            return CNLabeledValue<CNPhoneNumber>.self
        case .EmailAddresses:
            return CNLabeledValue<NSString>.self
        case .PostalAddresses:
            return CNLabeledValue<CNPostalAddress>.self
        case .URLAddresses:
            return CNLabeledValue<NSString>.self
        case .SocialProfiles:
            return CNLabeledValue<CNSocialProfile>.self
        case .InstantMessageAddresses:
            return CNLabeledValue<CNInstantMessageAddress>.self
        case .Dates:
            return NSDateComponents.self
        default:
            return nil
        }
    }

спасибо за любую помощь

...