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"
}
很容易为参数创建“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"
}