Я пытаюсь реорганизовать некоторый код обработки 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
}
}
спасибо за любую помощь