假设我有一个叫做 SwiftKit 的框架,其中包含了一个 UIView 的扩展类方法 someClassMethod 和一个名为 someProperty 的属性:
// SwiftKit
public extension UIView {
class func someClassMethod() {
print("someClassMethod from Swift Kit")
}
var someProperty: Double {
print("someProperty from Swift Kit")
return 0
}
}
我还有一个名为SwiftFoundation的框架,其中也有一个UIView扩展类方法名为someClassMethod和一个名为someProperty的属性:
// SwiftFoundation
public extension UIView {
class func someClassMethod() {
print("someClassMethod from Swift Foundation")
}
var someProperty: Double {
print("someProperty from Swift Foundation")
return 0
}
}
然后我创建了一个项目,引入了这些框架。问题是,如果我在同一个Swift文件中导入它们并访问这些扩展,我会得到一个“某些属性/某些类方法的使用不明确”的错误,即使我以SwiftKit.UIView.someClassMethod()的形式指定调用也是如此。
import UIKit
import SwiftKit
import SwiftFoundation
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.view.someProperty // error: Ambiguous use of 'somProperty'
SwiftKit.UIView.someClassMethod() // error: Ambiguous use of 'someClassMethod()'
}
}
如果我只导入其中一个,就能消除歧义错误,但是会发生奇怪的事情:
import UIKit
import SwiftKit
//import SwiftFoundation
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.view.someProperty
SwiftKit.UIView.someClassMethod()
}
}
控制台输出:
来自 Swift Foundation 的 someProperty
来自 Swift Foundation 的 someClassMethod
我的问题是:如何避免这些扩展(包括类方法、实例方法和属性)名称的歧义?如果不能,是否意味着我们应该像在 Objective-C 中一样为扩展名称添加前缀?
Module.UIColor.myCustomColor()
编译通过。 - Adam