Swift 可以为参数创建 "OR" 类型吗?

Could Swift create "OR" type for parameters?

很容易为参数创建“AND”类型:

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

如您所知,项目类型是 CVarArg 和 AnyObject。

但是如何创建“OR”类型来指示项目是 CVarArg 或 AnyObject???

谢谢:)

PS: 我试过 item:(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 ...
    }
}

你不能那样做。 Swift 是一种静态类型语言,在编译时编译器必须知道你的类型是什么。如果你的类型可以是一回事,编译器不知道如何解决这个问题。

想象一下,例如您使用方法 foo() 键入 A 并使用方法 bar() 键入 B。如果您的项目是 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))

使用函数重载:

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

func test(item: AnyObject) -> String? {
    return "B"
}