好多资料都一笔带过的认为String和NSString是互通的。
其实,这个互通是在import Foundation之后才有的,是Foundation里使用extensions让String具有了NSString的诸多能力。
一个非常坑爹的例子如下:
let str: String = String(format: "%0.2f", 10.0)
print(str)
如果说String和NSString是互通的话,那么这里应该是调用的是:
而实际上,因为没有import Foundation
,因此上述代码被如此解析:
- 一个Tuple: (format: "%0.2f", 10.0) ,他的第一个元素命名为format,第二个元素忽略了命名
- 元组被强制类型转换成String类型
- 被转换的字符串赋值给str变量
输出是:
("%0.2f", 10.0)
而如果添加import Foundation
,情况则完全是另外一个解析了:
str是一个String对象,使用init(format: NSString, _ args: CVarArgType...)构造函数初始化。
输出是:
10.00
两者完全不同。
可以想象,如果是import语句距离代码比较远,将会是什么样的情况?