在 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!)
  • 使用惰性 属性
  • 使用带有闭包的惰性属性