Swift:协议扩展以覆盖属性类型

时间:2018-07-10 19:15:37

标签: ios swift protocols

在下面的示例中,我正在构建一个处理未知对象类型的协议,我所知道的是该类型可以是3 - Hello 2 - Hello 1 - Hello $sql = "SELECT id, msg FROM messages "; $result = $conn->query($sql); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { echo " " . $row["id"]. " - " . $row["msg"]. "</br>"; } } 或完全不同的类{{1 }}。我想通过添加扩展来支持这些不同的类型类。至少那就是我认为正确的方法:

String

这是我想要实现的目标,但是我不可能解决两种类型的Int

我未知Resource属性类型。有什么好方法吗?

1 个答案:

答案 0 :(得分:1)

我想我有解决您问题的方法。您可以这样操作:

public class AbstractBase<T> {

  public var item: T?
  public init(_ i : T) {
      item = i
  }

  public func about() {
      print("Any")
      print(self.item)
  }
}

public extension AbstractBase where T == Int {

  public func about() {
      print("Int")
      print(self.item)
  }
}

public extension AbstractBase where T == String {

  public func about() {
      print("String")
      print(self.item)
  }
}

然后

AbstractBase("string").about()
AbstractBase(4).about()

将在控制台中为您提供

String
Optional("string")
Int
Optional(4)

任何其他类型都将转到AbstractBase about()实现。

当然,编译器必须在编译时知道类型。如果您在运行时需要这种类型的识别,我认为强制转换是唯一的方法。

希望它能对您有所帮助。