gpt4 book ai didi

swift - 为什么 `required` 不是 Swift 中类函数的有效关键字?

转载 作者:搜寻专家 更新时间:2023-10-31 22:51:47 25 4
gpt4 key购买 nike

似乎在某些情况下,Swift 类函数上的 required 关键字会非常有益,特别是由于类函数能够返回 Self .

当从 class func 返回 Self 时,不幸的是有两个限制使得实现所述函数非常困难/抑制:

  1. 您不能在函数实现中使用 Self 作为类型检查,即:

    class Donut {
    class func gimmeOne() -> Self {
    // Compiler error, 'Self' is only available in a protocol or as the result of a class method
    return Donut() as Self
    }
    }
  2. 您不能返回类本身的实际类型,即:

    class Donut {
    class func gimmeOne() -> Self {
    // Compiler error, 'Donut' is not convertible to 'Self'
    return Donut()
    }
    }

这些编译器错误的原因是有效的。如果你有一个 GlazedDonut 子类,它没有覆盖这个类的函数,调用 GlazedDonut.gimmeOne() 可能会给你一个 Donut不是 Self

看来这种情况可以通过允许类使用required 指定这些函数来缓解。这将确保任何子类重写该方法并进行它们自己的类型检查,确保 GlazedDonut 在所有情况下返回自身,从而消除 Donut 返回的可能性回来吧。

是否有技术、权威原因导致未添加?我想建议它作为对 Swift 团队的改进,但要确保没有明显的理由说明它被遗漏或无法完成。

这个问题的想法来源于这里:

https://stackoverflow.com/a/25924224/88111

最佳答案

required 通常只用在初始化器上,因为初始化器在 Swift 中并不总是继承的。因此,为了允许您在变量类(即元类类型的值,例如 Foo.Type)上调用初始化程序,您需要知道该类 Foo,以及所有可能的子类,都有这个初始化器。

但是,方法(实例方法和类方法)总是被继承的。因此,required 不是必需的。

顺便说一句,您断言“您不能返回类本身的实际类型”是不正确的。 (事实上​​,错误“'Self' is only available in a protocol or as the result of a class method”本身表示你可以返回类本身的类型。)类似于在 Objective-C 中,你可以这样做:

class Donut {
required init() { }
class func gimmeOne() -> Self {
return self()
}
}

关于swift - 为什么 `required` 不是 Swift 中类函数的有效关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25933785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com