我正在尝试重构一些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
}
}
感谢您的帮助