符合Swift协议的泛型类型

时间:2014-10-14 09:56:48

标签: generics types swift protocols

是否可以要求泛型类型的特定实例符合Swift中的协议?

例如,假设我有一个名为Thing<T>的泛型类型。我希望Thing<Int>符合某个协议,但不是Thing<T>

3 个答案:

答案 0 :(得分:3)

嗯,它可能不会太繁琐,而且你可能已经忽略了它,但你可以做一个'泛型类型的特定实例化' - 如下:

class ThingOfInt : Thing<Int>, SpecialIntProtocol {
 // implement SpecialIntProtocol (if it isn't already 
 // implemented in an extension)
}

或者更具普遍性:

class IntThing<T:IntegerType> : MyThing<T>, SpecialIntProtocol {
}

答案 1 :(得分: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>类型

添加额外的功能

我不知道在扩展中符合协议的方法,但它没有多大意义。

限制:通用where T :可以与协议和类一起使用,这就是我们无法在那里指定Int的原因

答案 2 :(得分:-3)

您可以执行类似使用where关键字的操作并传递条件。在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"> {
    ...
}