Как я могу создать универсальное расширение в Swift?

#swift

#swift

Вопрос:

Я хочу создать общее расширение, чтобы избежать повторения моего кода для разных типов. вот мой код, который нужно исправить!

     extension Bool {
    
    func print() { Swift.print(self.description) }
    
}

extension Int {
    
    func print() { Swift.print(self.description) }
    
}

extension String {
    
    func print() { Swift.print(self.description) }
    
}
 

  extension <T> {
    
    func print() { Swift.print(self.description) }
    
}



 
 

Ответ №1:

Ваше расширение не является «универсальным» в том смысле, что оно может применяться к любому типу. Он может применяться только к типам, которые имеют description свойство. Ну, какие типы имеют description свойство? Каждый тип, который соответствует CustomStringConvertible does!

Итак, вы должны создать расширение CustomStringConvertible :

 extension CustomStringConvertible {
    
    func print() { Swift.print(self.description) }
    
}
 

(Обратите внимание, что может существовать тип, который имеет description свойство, но не соответствует CustomStringConvertible , но большинство типов в стандартных библиотеках не такие)

Действительно универсальные расширения — это нечто другое, и в настоящее время они предлагаются, т.Е. Пока не являются частью Swift.

Комментарии:

1. У меня здесь небольшой вопрос: если я хочу, чтобы моя пользовательская функция print() работала с пользовательским типом, должен ли я работать над расширением CustomStringConvertible, я думаю?

2. @mimi Вы должны привести свой пользовательский тип в соответствие с CustomStringConvertible . например class CustomType: CustomStringConvertible { var description: String { ... } }

3. ага! итак, мой пользовательский тип должен описывать «var description», чтобы соответствовать CustomStringConvertible! Спасибо