具有CNLabeledValue类型的泛型函数

时间:2019-02-21 05:17:55

标签: swift generics cncontact

我正在尝试重构一些CNContact处理代码,以使其更易于管理和阅读。

CNContact使用CNLabeled<ValueType>,其中ValueType可以为CNPhoneNumber, NSString, CNPostalAddress, NSString, CNSocialProfile, CNInstantMessageAddressNSDateComponents

理想情况下,我想要一个通用函数,该函数将这些类型作为字符串或Types并从我的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
        }
    }

感谢您的帮助

0 个答案:

没有答案