Macos 在Swift中采用NSTextFinderBarContainer协议将强制进行变量初始化,而不考虑标头注释
我有一个Macos 在Swift中采用NSTextFinderBarContainer协议将强制进行变量初始化,而不考虑标头注释,macos,swift,cocoa,Macos,Swift,Cocoa,我有一个NSView子类,它实现了NSTextFinderBarContainer协议。NSTextFinderBarContainer协议的一部分正在实现 var findBarView: NSView { get set } 但是,原始Objective-C标题中此属性上方的注释为: NSTextFinder使用此属性将查找栏指定给 容器。容器可以自由修改视图的宽度,但 不应修改其高度。此属性由管理 NSTextFinder不应设置此属性。 因为Swift要求初始化所有实例变量,所以如何处
NSView
子类,它实现了NSTextFinderBarContainer
协议。NSTextFinderBarContainer
协议的一部分正在实现
var findBarView: NSView { get set }
但是,原始Objective-C标题中此属性上方的注释为:
NSTextFinder使用此属性将查找栏指定给
容器。容器可以自由修改视图的宽度,但
不应修改其高度。此属性由管理
NSTextFinder不应设置此属性。
因为Swift要求初始化所有实例变量,所以如何处理这种情况?Swift似乎要求我反对苹果在标题中所写的内容:您不应该设置此属性,因为它将由NSTextFinder
本身设置/管理
如果我不覆盖NSView初始值设定项,我会得到:
类“ExampleContainerView”没有初始值设定项
正如预期的那样,因为findBarView
没有初始值
我的Swift代码的相关部分包括:
class ExampleContainerView: NSView, NSTextFinderBarContainer {
var findBarView : NSView
...
}
如果我覆盖指定的初始值设定项来初始化findBarView
,如下所示(忽略标题中苹果的注释):
NSTextFinder发送setFindBarContainer:
消息后,应用程序崩溃
-[NSView _setTextFinder:]:发送到实例0x6000001278a0的无法识别的选择器
0x6000001278a0处的对象是在上面覆盖的初始值设定项中设置的NSView实例。从Xcode 7.0 beta 6开始,这看起来是固定的
NSTextFinderBarContainer
现在将findBarView
声明为可选的NSView
:
public var findBarView:NSView?{get set}
此外,contentView()
还更改为返回可选的NSView
:
可选公共函数contentView()->NSView?
将属性设置为可选意味着不再存在让API注释说不要设置
findBarView
,而让Swift要求在初始值设定项中初始化所有非可选属性的矛盾。从Xcode 7.0 beta 6开始,这似乎是固定的NSTextFinderBarContainer
现在将findBarView
声明为可选的NSView
:
public var findBarView:NSView?{get set}
此外,contentView()
还更改为返回可选的NSView
:
可选公共函数contentView()->NSView?
将属性设置为可选意味着不再存在让API注释说不要设置findBarView
,而让Swift要求在初始值设定项中初始化所有非可选属性的矛盾
required init?(coder: NSCoder) {
findBarView = NSView(frame: NSRect())
super.init(coder: coder)
}