符合协议的类的Swift集合

时间:2015-08-13 23:34:27

标签: swift

是否可以针对类和协议构造集合(数组,字典,集)类型检查值?给出:

class Piece {
  var name: String?
}

protocol Jump {
  func jump() { ... }
}

protocol Move {
  func move() { ... }
}

允许:

var pieces: [Piece]?

或者:

 var moves: [Move]?
 var jumps: [Jump]?

或者:

 var movenjump: [protocol <Move,Jump>]

但是,我不确定如何将集合限制为PieceMove的{​​{1}}个实例。

1 个答案:

答案 0 :(得分:0)

简短的回答是否定的。迄今为止,Swift仅允许集合用于单个类型或协议类型(单个协议或多个协议)。但有一些方法可以解决这个问题。

  1. 最佳方法是,如果Piece是您的代码,请尝试将其作为协议。然后你可以声明数组,例如:let anArray: [protocol<Piece, Move, Jump>]

  2. 如果您无法访问Piece的源代码,请尝试生成需要声明集合的周围类。这样,您可以使用where子句将泛型类型约束为您喜欢的任何类型:

    class MyClass<T where T: Piece, T: Move, T: Jump> {
        var myCollection: [T]?
    }