gra*_*ley 6 initialization ios swift
像UIView这样的特殊类有多个指定的初始化程序.
在Objective-X中,我们可以将常见初始化分解为单独的函数
- (id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super initWithCoder:aDecoder]) {
[self initialize];
}
return self;
}
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self initialize];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
在Swift中,这不再是一种可能性,因为以下代码会导致"在super.init调用之前自行使用"
override init(frame: CGRect) {
self.initialize()
super.init(frame: frame)
}
required init(coder aDecoder: NSCoder) {
self.initialize()
super.init(coder: aDecoder)
}
Run Code Online (Sandbox Code Playgroud)
在super.init之后放置self.initialize也没有帮助,因为我的整个目的是初始化成员.以下将导致'属性self.X未在super.init调用时初始化'
var X : Int
override init(frame: CGRect) {
super.init(frame: frame)
self.initialize()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.initialize()
}
Run Code Online (Sandbox Code Playgroud)
如果我想在这种情况下考虑常见的初始化,我该怎么办?请注意,我特别不想使用awakeFromNib,因为我希望我的对象在我的对象层次结构中的任何相关awakeFromNib实现中可用.另请注意,选项对我的用例没有意义.
显而易见的答案是initialize
在调用后调用super.init
:
override init(frame: CGRect) {
super.init(frame: frame)
self.initialize()
}
Run Code Online (Sandbox Code Playgroud)
但是,您可能希望在initialize
方法中初始化一些实例变量。事实是这样的:
super
。self
(或访问 上的计算属性self
)super.init
。不可避免的结论是,如果您想要在 中初始化实例变量initialize
,则必须使用var
、 not声明每个此类变量let
,并执行以下操作之一:
给实例变量一个默认值:
var name: String = "Fred"
Run Code Online (Sandbox Code Playgroud)创建实例变量Optional
,并将其初始化为 nil:
var name: String?
Run Code Online (Sandbox Code Playgroud)创建实例变量ImplicitlyUnwrappedOptional
,并将其初始化为 nil:
var name: String!
Run Code Online (Sandbox Code Playgroud)我此时的偏好是#2(创建它Optional
并初始化为nil)。
归档时间: |
|
查看次数: |
928 次 |
最近记录: |