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

问题描述 投票:1回答:2

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

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

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

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

谢谢 :)

PS:我试过了项目:(项目:(CVarArg | AnyObject))

但它不起作用!

Updating 1:

我只想在CVarArg和AnyObject之间使用限制项的类型,然后自己编码:

func test(item:(CVarArg|AnyObject))->String?{
    if item is CVarArg {
        // Do something for CVarArg
    }else{
        // Must be AnyObject,Do something ...
    }
}
swift definition
2个回答
1
投票

你不能这样做。 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))

3
投票

使用函数重载:

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

func test(item: AnyObject) -> String? {
    return "B"
}
© www.soinside.com 2019 - 2024. All rights reserved.