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,因为一个变量不能同时是 URL
和 String
但是回答你的问题你 不能 去做吧!
但我想你已经知道了,因为编译器可能告诉你了:
Consecutive declarations on a line must be separated by ';'
但是如果你希望 ValueToSet
是 URL
、String
或 Bool
这应该是因为这 3 种类型有一些你需要的共同点,并且这意味着符合 protocol
或 inheritance
来自基础 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)
这种方法不会让你走得太远, 提出的方法可能最适合你。
我正在尝试将泛型类型限制为可以保存到 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,因为一个变量不能同时是 URL
和 String
但是回答你的问题你 不能 去做吧!
但我想你已经知道了,因为编译器可能告诉你了:
Consecutive declarations on a line must be separated by ';'
但是如果你希望 ValueToSet
是 URL
、String
或 Bool
这应该是因为这 3 种类型有一些你需要的共同点,并且这意味着符合 protocol
或 inheritance
来自基础 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)
这种方法不会让你走得太远,