gpt4 book ai didi

swift - 在扩展中重新声明成员*有时*会隐藏原始成员。为什么?

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

一个偶然的机会,我发现你可以在没有编译器提示的情况下这样做:

extension Date {
var timeIntervalSinceNow: TimeInterval {
return 1000
}
}

更奇怪的是,这个实际上的计算结果为 1000:

Date().timeIntervalSinceNow
  • 扩展名似乎隐藏了原来的成员。

所以我试着用我自己的类(class)来做到这一点:

class A {
var a: String {
return "A"
}
}

extension A {
var a: String {
return "a"
}
}
  • 编译失败:“'a' 的重新声明无效”。

我观察到这不会影响原始成员通过协议(protocol)的使用,这是隐藏的预期行为:

extension Date {
var description: String {
return "XXXX"
}
}

let date: CustomStringConvertible = Date()
date.description // normal date

Date().description // "XXXX"

你能解释一下为什么会出现子弹头现象吗?

最佳答案

之所以可行,是因为您在与原始变量声明不同的模块中声明此扩展。

跨模块可以重载变量名,但在我看来这是 Swift 的一个缺点,因为目前没有办法明确说明你想要哪个模块声明。

关于swift - 在扩展中重新声明成员*有时*会隐藏原始成员。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46123963/

25 4 0
文章推荐: ios - 从我的应用程序打开优步,在不使用 sdk 的情况下预先填充上车和下车位置
文章推荐: java - 使用 RSE 通过 Eclipse 将远程源作为 Java 项目 check out
文章推荐: 用于提取
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com