在ObjectiveC.swift从标准库文件包含大约228行代码下面几行:
extension NSObject : Equatable, Hashable {
/// ...
open var hashValue: Int {
return hash
}
}
Run Code Online (Sandbox Code Playgroud)
open var在这种情况下意味着什么,或者open一般来说关键字是什么?
我一直在使用Swift中的iOS应用程序(其中大部分都是从Objective-C中移除的).我正在使用Core Data并尝试使用扩展来为我的模型自动生成的类添加功能.我在Objective-C中做的一件事就是在类A的类别中添加一个方法,并在类B(从A派生)的类别中覆盖该方法,我希望在Swift中也这样做.
有一段时间我在我的项目中已经有了以下代码(这只是一个例子),虽然我还没有使用过这个功能,但编译器已经很好地编译了这段代码:
// From CellType.swift -- NOTE: Imports from Foundation and CoreData
@objc(CellType)
class CellType: NSManagedObject {
@NSManaged var maxUses: NSNumber
@NSManaged var useCount: NSNumber
// Other properties removed for brevity
}
// From SwitchCellType.swift -- NOTE: Imports from Foundation and CoreData
@objc(SwitchCellType)
class SwitchCellType: CellType {
@NSManaged var targetCellXIndex: NSNumber
@NSManaged var targetCellYIndex: NSNumber
@NSManaged var targetCellType: CellType
// Other properties removed for brevity
}
// From CellTypeLogic.swift -- NOTE: Imports from Foundation and CoreData
extension CellType
{ …Run Code Online (Sandbox Code Playgroud) 我在另一个模块(使用pod)中声明了类扩展.
public extension UIView {
open func doStuff() {...}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在当前项目模块中的子类中重写此方法时
class ConcreteView : UIView {
override open func doStuff() {...}
}
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
覆盖其定义模块之外的非打开实例方法
尽管该方法实际上标记为开放
作为一种解决方法,我在同一模块中声明了另一个类,其中声明了扩展并在那里覆盖了所需的方法
public class CustomView: UIView {
override open func doStuff() {...}
}
Run Code Online (Sandbox Code Playgroud)
并在主模块中将此类设置为我的类的超类
class ConcreteView : CustomView
Run Code Online (Sandbox Code Playgroud)
所以只有在此之后我才能覆盖该方法.
它看起来真的像swift3中的一个错误,但也许我已经省略了为什么它以这种方式工作的一些理解?