繁体   English   中英

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 ...
    }
}

使用函数重载:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM