你能将 Swift 泛型约束限制为一组已知类型吗?

ken*_*nyc 3 generics macos swift

struct给定一个带有通用约束的基本 Swift,如下所示:

struct MetadataValue<T> {
  var value:T

  init(_ value:T) {
    self.value = value
  }
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以限制T它只能是某种允许类型中的一种吗?前任:

struct MetadataValue<T> where T:Double or T:Bool or T:String {
  ... 
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用组合来“和”约束,但是我可以以某种方式“或”约束吗?

目标:

用例场景是我能够存储图像和视频等元数据属性及其相应的值。我跟踪数百个不同的属性,但每个属性的值都是已知类型:如 String、Integer 或 Double,但显然不能是泛型T可能意外接受的任意类型。

Chr*_*ski 7

我可以以某种方式“或”限制吗?

你不能。然而,这将实现相同的目标。

定义一个新的协议:

protocol MetadataRawValue { }
Run Code Online (Sandbox Code Playgroud)

添加您的符合类型:

extension Double: MetadataRawValue { }

extension Bool: MetadataRawValue { }

extension String: MetadataRawValue { }
Run Code Online (Sandbox Code Playgroud)

最后:

struct MetadataValue<T> where T: MetadataRawValue {
  ... 
}
Run Code Online (Sandbox Code Playgroud)