Swift: 调用具有不明确 return 类型的重载方法
Swift: call overloaded method with ambiguous return type
假设我有以下代码:
public class A {}
public class B : A {}
public class Foo {
public func bar() -> A {
print("secret hidden method")
return A()
}
public func bar() -> B {
print("easily accessible method")
return B()
}
}
问题是尝试调用它们会导致歧义。您可以使用 Foo().bar() as B
调用 bar() -> B
,但所有 Foo().bar()
、Foo().bar() as A
和 let a: A = Foo().bar()
都会产生 Ambiguous use of 'bar()'
编译器错误。
底线:如何调用 bar() -> A
? 它有一些棘手的语法吗?有必要反思吗?反射是否足够?
编译器需要能够确定您要执行 bar()
的哪个变体。您可以明确说明要执行的 func
类型,并利用柯里化访问给定实例的正确实现。
let foo = Foo()
let a: ()->A = Foo.bar(foo)
let b: ()->B = Foo.bar(foo)
a()
b()
以上代码将打印:
secret hidden method
easily accessible method
假设我有以下代码:
public class A {}
public class B : A {}
public class Foo {
public func bar() -> A {
print("secret hidden method")
return A()
}
public func bar() -> B {
print("easily accessible method")
return B()
}
}
问题是尝试调用它们会导致歧义。您可以使用 Foo().bar() as B
调用 bar() -> B
,但所有 Foo().bar()
、Foo().bar() as A
和 let a: A = Foo().bar()
都会产生 Ambiguous use of 'bar()'
编译器错误。
底线:如何调用 bar() -> A
? 它有一些棘手的语法吗?有必要反思吗?反射是否足够?
编译器需要能够确定您要执行 bar()
的哪个变体。您可以明确说明要执行的 func
类型,并利用柯里化访问给定实例的正确实现。
let foo = Foo()
let a: ()->A = Foo.bar(foo)
let b: ()->B = Foo.bar(foo)
a()
b()
以上代码将打印:
secret hidden method
easily accessible method