在 Swift 中为自定义 NSView 提供指定的初始化程序
providing a designated initializer for a custom NSView in Swift
我有一个自定义 NSView Class,看起来像:
class MyClass: NSView
{
var myClassVar: NSColor
}
当然,Xcode 抱怨我的 class 没有初始化器,所以我需要覆盖指定的初始化器,这样我才能初始化我的ClassVar.
我该怎么做?
试试这个;
class MyClass: NSView
{
var myClassVar: NSColor! // the optional mark ! to be noticed.
override init(frame frameRect: NSRect) {
super.init(frame:frameRect);
}
required init(coder: NSCoder) {
super.init(coder: coder)
}
//or customized constructor/ init
init(frame frameRect: NSRect, otherInfo:Int) {
super.init(frame:frameRect);
// other code
}
}
如果你给你的颜色一个默认值,NSView 的初始化器应该仍然有效。
这里有几种方法可以做到这一点:
var myClassVar: NSColor?
var myClassVar: NSColor! // make sure to set this before you actually access it
var myClassVar: NSColor = NSColor.clearColor()
第二个示例(隐式解包可选)是 Apple 使用 IBOutlets 所做的。否则,您将需要一个初始化程序,在初始化方法中将每个变量设置为非空值。
有关这方面的更多信息,请参阅 Swift Initialization and the Pain of Optionals,其中讨论了这些解决方案:
- 在调用 super.init 之前实例化它。
- 可选变量(
NSColor?
),在super.init 之后实例化
- 隐式展开可选变量 (
NSColor!
)
- 使用惰性 属性
- 使用带有闭包的惰性属性
我有一个自定义 NSView Class,看起来像:
class MyClass: NSView
{
var myClassVar: NSColor
}
当然,Xcode 抱怨我的 class 没有初始化器,所以我需要覆盖指定的初始化器,这样我才能初始化我的ClassVar.
我该怎么做?
试试这个;
class MyClass: NSView
{
var myClassVar: NSColor! // the optional mark ! to be noticed.
override init(frame frameRect: NSRect) {
super.init(frame:frameRect);
}
required init(coder: NSCoder) {
super.init(coder: coder)
}
//or customized constructor/ init
init(frame frameRect: NSRect, otherInfo:Int) {
super.init(frame:frameRect);
// other code
}
}
如果你给你的颜色一个默认值,NSView 的初始化器应该仍然有效。
这里有几种方法可以做到这一点:
var myClassVar: NSColor?
var myClassVar: NSColor! // make sure to set this before you actually access it
var myClassVar: NSColor = NSColor.clearColor()
第二个示例(隐式解包可选)是 Apple 使用 IBOutlets 所做的。否则,您将需要一个初始化程序,在初始化方法中将每个变量设置为非空值。
有关这方面的更多信息,请参阅 Swift Initialization and the Pain of Optionals,其中讨论了这些解决方案:
- 在调用 super.init 之前实例化它。
- 可选变量(
NSColor?
),在super.init 之后实例化
- 隐式展开可选变量 (
NSColor!
) - 使用惰性 属性
- 使用带有闭包的惰性属性