刚开始学习Swift ,我真的对以下行为感到困惑.

这是我在没有基础的情况下运行String.Containers时得到的结果:

"".contains("") // true
"a".contains("") // true
"a".contains("a") // true
"" == "" // true

这就是我从基金会得到的:

import Foundation

"".contains("") // false
"a".contains("") // false
"a".contains("a") // true
"" == "" // true

为什么根据我是否导入Foundation,结果会有所不同?还有其他这样的差异吗?有没有一份详尽的 list ?在基金会的文档中没有找到任何东西,但这似乎很重要,需要记录下来.我只知道另外this个例子.

还有:这种情况会发生吗?这正常吗?据我所知,Swift有一些类似扩展的东西,一旦它们被包括进来,就会改变某个东西的每个实例的行为,但肯定这只会增加行为,而不是改变现有的行为.如果现有的行为被改变了,语言不是应该以某种方式表明这一点,比如如果我想要不同的行为,就让我使用不同的类型吗?

推荐答案

基本上这与我回答的here个问题是一样的.

Foundation不是SWIFT的一部分,它是Cocoa的一部分,Cocoa是比SWIFT早很多年的更古老的Object-C库.Foundation的字符串版本是NSString.但是SWIFT字符串被"桥接"到了NSString,所以只要您导入Foundation,就会有一批NSString方法活跃起来,就像它们是SWIFT字符串的一部分一样,尽管它们不是.在您的例子中,您实际上最终调用了一个完全不同的方法,正如您已经发现的那样,它会产生不同的结果.

查看这一点的一个好方法是按住命令并单击代码中的术语contains(或者更好的方法是,按住Option并单击它,然后在开发人员文档中单击Open):

  • 如果尚未导入Foundation(或UIKit),则会跳到Swift字符串的contains.
  • 如果你是have个导入的基础,你会跳到contains个基础.

至于本部:

难道语言不应该以某种方式表明这一点吗

恐怕Stack Overflow在回答"应该"问题时不是很好.我会说,是的,这有点令人抓狂,但这是我们为SWIFT轻松无缝地融入可可编程世界而付出的代价的一部分.你可能会争辩说,Swift 的人不应该把他们的方法命名为contains,但那列火车已经离开了车站,而且,这个名字完美地表明了这种方法的用途.

另一件要记住的事情是,您可能永远不会在Foundation存在的情况下使用SWIFT except(可能是因为您在UIKit、SwiftUI或AppKit存在的情况下),因此在实际操作中不会出现问题.你遇到了一个不同寻常的边缘情况,这是值得称赞的,但ex hypothesi,不同寻常.


让事情变得更复杂的是,我认为您遇到的SWIFT库方法可能只是作为Xcode 14和SWIFT 5.7等的一部分引入的.有关新字符串功能的WWDC‘22讨论,请参见https://developer.apple.com/videos/play/wwdc2022/110354/?time=1415.在Xcode的早期版本中,短语"a".contains("")在没有Foundation的情况下甚至不会编译-因此问题永远不会出现!

Swift相关问答推荐

自定义完整屏幕封面动画

阴影动画的动画不流畅

当计数大于索引时,索引超出范围崩溃

仅当单击UIButton时才调用计时器函数

调度组是否阻止iOS中的主线程?

Swift 扩展:通过方法重载增强现有类

为什么Swift可以在没有足够信息的情况下推断类型?

RxSwift 中 Single.just(...) 和 Observable.just(...) 之间有区别吗?

如何更新 UserDefault 中的特定值

这是 Int64 Swift Decoding 多余的吗?

为什么 performSegue() 不调用 shouldPerformSegue()

如何在 Swift 中的两个 UIView 中心之间添加线?

如何让 UIKit 挤压你的视图,使其适合屏幕

如何在 Swift 中返回 Task 中定义的变量

如何使用 Date.ParseStrategy 在 Swift 5.6 中将字符串解析为日期?

使用 swift 运行 pod install 时出错

EXC_BREAKPOINT 崩溃的原因范围

在 Xcode 中自动实现 Swift 协议方法

swift中静态函数和单例类的区别

如何将 Int 拆分为其各个数字?