在Swift中是否有一种方法可以将泛型约束为一种类型?

时间:2019-10-17 16:00:10

标签: swift

是否可以为通用添加多个可选约束?我希望我的泛型是字符串或布尔值。像这样:

func myFunction<T>(_ dict: [String: T]) where T == String || T == Bool {
    // Do stuff with dict
}

2 个答案:

答案 0 :(得分:2)

您不能将通用事件限制为一种类型:

// error: Same-type requirement makes generic parameter 'T' non-generic
func myFunction<T>(_ dict: [String: T]) where T == String {

}

您可能希望某些类型的函数重载:

func myFunction(_ dict: [String: String]) {
    print("String")
}

func myFunction(_ dict: [String: Bool]) {
    print("Bool")
}

let strings = ["a": "b"]
let bools = ["a": false]

myFunction(strings) // print String
myFunction(bools) // print Bool

答案 1 :(得分:2)

您可以只创建一个协议并使String和Bool符合该协议:

func myFunction<T: StringOrBool>(_ dict: [String: T])  {
    print(dict)
}

myFunction(["a": true])
myFunction(["b": "test"])
myFunction(["b": 1]) // error: MyPlayground Xcode 11.playground:706:1: error: global function 'myFunction' requires that 'Int' conform to 'StringOrBool'

{{1}}