假设我有一个名为SwiftKit的框架,它有一个名为someClassMethod的UIView扩展类方法和一个名为someProperty的属性:
// SwiftKit
public extension UIView {
class func someClassMethod() {
print("someClassMethod from Swift Kit")
}
var someProperty: Double {
print("someProperty from Swift Kit")
return 0
}
}
Run Code Online (Sandbox Code Playgroud)
我还有一个名为SwiftFoundation的框架,它还有一个名为someClassMethod的UIView扩展类方法和一个名为someProperty的属性:
// SwiftFoundation
public extension UIView {
class func someClassMethod() {
print("someClassMethod from Swift Foundation")
}
var someProperty: Double {
print("someProperty from Swift Foundation")
return 0
}
}
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个项目介绍这些框架,事情是,如果我在同一个swift文件中导入它们并访问这些扩展,我得到了"不明确使用someProperty/someClassMethod()"错误,即使我指定了调用SwiftKit.UIView.someClassMethod()的形式:
import UIKit
import SwiftKit
import SwiftFoundation
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the …Run Code Online (Sandbox Code Playgroud) 在Swift中,不再需要为类添加前缀,因为它们的模块充当命名空间.
前缀扩展功能怎么样?例如:
extension UIImage {
public func hnk_hasAlpha() -> Bool { ... }
}
Run Code Online (Sandbox Code Playgroud)
一方面Swift不是动态的,因此冲突会产生编译错误.
但是,如果编译代码在未来的iOS/OS X版本中运行,其中添加了一个扩展方法,会发生什么?即使它们具有相同的签名,不同模块中的方法也会被视为不同的符号吗?
如果扩展类是NSObject子类或纯Swift类,它会有所不同吗?