Общая функция с типами CNLabeledValue

Я пытаюсь изменить некоторые CNContact обработка кода для упрощения управления и чтения.

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

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

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

    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
        }
    }

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

0 ответов

Другие вопросы по тегам