Общий тип, соответствующий протоколу в Swift
Можно ли требовать, чтобы конкретные экземпляры типичных типов соответствовали протоколу в Swift?
Например, скажем, у меня есть общий тип, называемый Thing<T>
. Я хочу, чтобы Thing<Int>
соответствовал определенному протоколу, но не Thing<T>
.
Ответы
Ответ 1
Ну, это может быть не слишком обременительно, и может быть достаточно очевидным, что вы проигнорировали его, но вы можете сделать "конкретное создание типичного типа" - как:
class ThingOfInt : Thing<Int>, SpecialIntProtocol {
// implement SpecialIntProtocol (if it isn't already
// implemented in an extension)
}
или с немного большей общностью:
class IntThing<T:IntegerType> : MyThing<T>, SpecialIntProtocol {
}
Ответ 2
В Swift 2.0 вы можете расширить протоколы и типы
При его расширении вы можете добавить общие ограничения where
. Только те типы, которые соответствуют этому правилу, смогут использовать эту функциональность
Пример:
public struct Thing<T> {
let x: T
}
extension Thing where T : IntegerType {
func giveMeInt () -> T {
return x
}
}
let a = Thing<Int>(x: 10)
a.giveMeInt()
let b = Thing(x: 10.1)
//b.giveMeInt() // Error
Таким образом вы можете добавить дополнительную функциональность в тип Thing<Int>
Я не знаю способ соответствовать протоколу в расширении, но это не имеет большого смысла.
Ограничение: Generic where T :
может использоваться с протоколами и классами, поэтому мы не можем указывать Int там
Ответ 3
Вы можете сделать что-то вроде использования ключевого слова where
и передать условия послесловия. Увидел это в разделе "Где разделы" https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Generics.html#//apple_ref/doc/uid/TP40014097-CH26-XID_275
class Thing<T : SomeProtocol where reflect(T).summary != "Int"> {
...
}