Swift 使用 or 运算符的泛型类型约束

Swift Generic Type Constraint with or operator

我正在尝试将泛型类型限制为可以保存到 UserDefaults 类型的协议。

是否可以使用符合特定类型或其他特定类型的类型约束?

例如下面的示例代码有效。

public protocol UserDefaultsRequestType {

    associatedtype ValueToSet where ValueToSet == URL

    var valueToSet: ValueToSet { get }
}

我想要达到的目标就是打击

public protocol UserDefaultsRequestType {

    // Value should either be a type URL, String or Bool
    associatedtype ValueToSet where ValueToSet == URL || ValueToSet == String || ValueToSet == Bool

    var valueToSet: ValueToSet { get }
}

这看起来更像是 XOR,因为一个变量不能同时是 URLString 但是回答你的问题你 不能 去做吧!

但我想你已经知道了,因为编译器可能告诉你了:

Consecutive declarations on a line must be separated by ';'

但是如果你希望 ValueToSetURLStringBool 这应该是因为这 3 种类型有一些你需要的共同点,并且这意味着符合 protocolinheritance 来自基础 class.

你给的3种类型符合

  • CKRecordValueProtocol
  • 自定义反射
  • CustomStringConvertible
  • CVarArg
  • 可解码
  • 可编码
  • 平等
  • 可哈希
  • MLDataValueConvertible

假设您希望能够将它们用作 Dictionary 中的键,您可以这样写:

associatedtype ValueToSet where ValueToSet: Hashable

表示ValueToSet可以是任何类型,符合Hashable.

但是由于您似乎正在使用 UserDefaults 并且它的 public 设置默认值的方法是 而不是 使用 protocols 也不是 classes.

例如:

func set(_ url: URL?, forKey defaultName: String)

这种方法不会让你走得太远, 提出的方法可能最适合你。