Swift - 使用不同的默认参数覆盖函数
Posted
技术标签:
【中文标题】Swift - 使用不同的默认参数覆盖函数【英文标题】:Swift - Overriding functions with different default parameters 【发布时间】:2016-10-13 14:54:22 【问题描述】:案例:基类 (A) 和函数 (doSomething) 具有默认参数 (param: T = foo),子类 (B) 使用不同的默认参数 (param: T =酒吧)。 但随后被称为 A。
编辑:对原始代码表示歉意,所以实际上发生的事情基本上如下:
class Foo
func doSomething(a: String = "123")
print(a)
class Bar: Foo
override func doSomething(a: String = "abc")
print("Using Bar method body... but not Bar's default a value!")
print(a)
(Bar() as Foo).doSomething()
// Prints:
// Using Bar method body... but not Bar's default a value!
// 123
它使用函数体但不使用函数默认参数是错误还是预期行为?
【问题讨论】:
无法重现,至少不能用字符串替换 T。在 Swift 3 中输出是“bar”。你能提供一个独立的例子吗? 进一步研究,它可能松散地链接到我们看到的另一个错误link,其中编译器/链接器似乎只查看函数的***覆盖。跨度> 那个 似乎是关于 Objective-C 协议的,我在你的例子中没有看到。T
在您的代码中也未定义。 – 同样:一个独立的例子来证明这个问题会很有帮助。
@MartinR 对更改表示歉意(对于这样的发布是新的)-我们已经对此进行了进一步的研究并找到了原因,这是有道理的,但是为什么不接受 Bar 的参数福的。
你确定你在 Swift 2 中观察到了不同的行为吗?
【参考方案1】:
它被称为 Foo(或 A)因为你告诉它。因为你正在实例化 Bar() as Foo
,它正在这样做正是这样。
如果你这样做:
Bar().doSomething()
Bar的方法就是所谓的:
Using Bar method body...
abc
有趣的是,正如您所指出的:
(Bar() as Foo).doSomething()
产量:
Using Bar method body...
123
因为 Bar 被实例化为 Foo,(注意强调)Bar 获取 Foo 的默认参数,但仍然执行 Bar 的函数体。
有趣的观察!
【讨论】:
以上是关于Swift - 使用不同的默认参数覆盖函数的主要内容,如果未能解决你的问题,请参考以下文章