【发布时间】:2015-12-20 14:26:08
【问题描述】:
假设我有一个名为 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
}
}
我还有一个叫 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 文件并访问这些扩展,我得到一个“模糊使用 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 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 基金会的 someProperty
来自 Swift Foundation 的 someClassMethod
我的问题是:我如何才能毫不含糊地调用这些扩展(类/实例方法、属性)?如果不能,是否意味着我们应该像通常使用 Objective-C 一样为扩展名添加前缀?
【问题讨论】:
-
我假设 ModuleA.UIColor.randomColor() 有效(假设您将其定义为 类方法)。你试过了吗?
-
我刚刚检查了一个类似的扩展,
Module.UIColor.myCustomColor()编译得很好。 -
@MartinR 感谢您的回复,我已经把问题说得更清楚了,非常感谢您的进一步帮助。
-
我的假设(我自己没有测试过):它应该适用于纯 Swift 类,但不适用于从 NSObject 继承的类,因为在不同的类类别中定义相同的方法在 Objective 中是未定义的行为-C.
-
我可以建议清理和构建吗?
标签: swift namespaces swift-extensions