Может ли Swift создать тип «ИЛИ» для параметров? - PullRequest
0 голосов
/ 03 марта 2019

Легко создать тип «И» для параметра:

func test(item:(CVarArg&AnyObject))->String?{
    return nil
}

, как вы знаете, тип элемента - CVarArg и AnyObject.

, но как создать тип «ИЛИ», чтобы указатьэлемент CVarArg или AnyObject ???

спасибо:)

PS: я пробовал элемент: (item: (CVarArg | AnyObject))

, но он не работает!

Обновление 1:

Я хочу ограничить тип элемента только между CVarArg и AnyObject, а затем написать сам:

func test(item:(CVarArg|AnyObject))->String?{
    if item is CVarArg {
        // Do something for CVarArg
    }else{
        // Must be AnyObject,Do something ...
    }
}

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Использовать функцию перегрузки:

func test(item: CVarArg...) -> String? {
    return "A"
}

func test(item: AnyObject) -> String? {
    return "B"
}
0 голосов
/ 03 марта 2019

Вы не можете этого сделать.Swift - статически типизированный язык, и во время компиляции компилятор должен понимать, какой у вас тип.Если ваш тип может быть одним или другим, компилятор не знает, как его решить.

Представьте себе, например, что у вас есть тип A с методом foo() и тип B с методом bar().Если ваш элемент A or B, как компилятор разрешит вызов foo() или bar() во время компиляции?Это просто невозможно, поскольку нет никаких гарантий, что ваш тип будет реализовывать любые из них.Я бы предложил вам создать свою функцию с двумя отдельными необязательными параметрами.Что-то вроде:

func test(item: CVarArg?, other: AnyObject?)->String? {
    return nil
}

Затем проверьте, какой из параметров передан.Надеюсь, что это поможет!

РЕДАКТИРОВАТЬ

Другой вариант, который у вас также есть, - заключить ваши типы в перечисляемые случаи.Что-то вроде:

enum Item {
  case foo(CVarArg)
  case bar(AnyObject)
}

func test(item: Item) {
  switch item {
  case .foo(let arg):
    // arg is CVarArg
    print(arg)
  case .bar(let obj):
    // obj is AnyObject
    print(obj)
  }
}

var arg: CVarArg!
test(item: .foo(arg))
...