Можете ли вы указать общие типы или дать одному параметру более одного типа? - PullRequest
0 голосов
/ 24 октября 2018

Например, я хочу указать тип, который может быть Integer или String, и использовать его как специальный тип в func, я попробовал typealias, но это не решит проблему, потому что typealiases не может иметь or аргументы, поскольку он использует только &, поэтому рассмотрим случай ниже.

typealias alis = StringProtocol & Numeric


func foo <T: alis> (vee: T) -> T{
// do something
    return vee
}

Я хочу, чтобы эта функция принимала тип параметра (Int или String), а не чего-либо еще (<T>),

, как вы можете видеть, я пыталсяс typealias и у меня нет ошибки компиляции.

однако попытка использования функции приведет к этим ошибкам.

foo(vee: 1) //Argument type 'Int' does not conform to expected type 'StringProtocol'

И

foo(vee: "v") //Argument type 'String' does not conform to expected type 'Numeric'

это достижимо с помощью swift?если так как

1 Ответ

0 голосов
/ 24 октября 2018

Предположим, что вы могли бы использовать оператор ИЛИ для объединения протоколов, что бы вы могли сделать с чем-то типа (Int | String)?

Не все, что вы можете сделать сInt может быть сделано на (Int | String), потому что это может быть строка, лежащая в основе.Точно так же, не все, что вы можете сделать с String, может быть сделано на (Int | String), потому что это может быть Int в своей основе.

Теперь вы можете сказать: «Ах. Я знаю, что Int иString оба имеют свойство description. Я должен иметь возможность доступа к description для переменной типа (Int | String). "

В таком случае, вы можете просто создать такой протокол самостоятельнои только Int и String соответствуют ему:

protocol IntOrString {
    var description: String { get }
}

extension Int : IntOrString {}
extension String : IntOrString {}

(Обратите внимание, что description уже определено в CustomStringConvertible. Ради аргумента представьте, что его не существует.)

...