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 - 使用不同的默认参数覆盖函数的主要内容,如果未能解决你的问题,请参考以下文章

覆盖函数的默认参数[重复]

使用Swift为输入参数添加默认值

使用子解析器时,命令行参数被默认值覆盖

php学习笔记-默认参数

函数 6默认参数

Typescript的函数