Есть ли способ ограничить родовой тип тем или иным типом в Swift? - PullRequest
1 голос
/ 17 октября 2019

Есть ли способ добавить несколько дополнительных ограничений в общий? Я бы хотел, чтобы мой дженерик был либо строкой, либо булом. Что-то вроде:

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

Ответы [ 2 ]

2 голосов
/ 17 октября 2019

Вы можете просто создать протокол и заставить String и Bool соответствовать ему:

protocol StringOrBool { }
extension Bool: StringOrBool {}
extension String: StringOrBool {}

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'
2 голосов
/ 17 октября 2019

Вы не можете ограничить событие универсальным типом для одного единственного типа:

// 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...