Общий тип, соответствующий протоколу в 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 там