物件导向的设计中,关於建构物件的方式我们成为建构器(constructor),这关系到物件使用的方式,是很重要的事情。
Photo by @kellysikkema on Unsplash
而 Objective-C 的物件因为都是继承自 NSObject,这代表所有的 物件将会自带有 init()
的建构器。在我们可以透过 @available(*, unavailable)
的方式透过编译器的阻挡来限制
// Swift
class Base { init() {}}
class Sub: Base {
@available(*, unavailable, message: "please using init(name:)")
override init() {fatalError("Will never perform")}
init(name:String) {
super.init()
...
}
}
let sub = Sub() // 'init()' is unavailable: please using init(name:)
关於
@avaliable
,请参考 Attributes — The Swift Programming Language
NS_UNAVAILABLE
在 Objective-C 我们可以使用同样的方式来表达 unavailable
,透过 NS_UNAVAILABLE
,而 Swift interface 则可以透过这个关键字提供错误呼叫的提示。
// Objective-C
@interface OCSub: NSObject
-(instancetype) init NS_UNAVAILABLE;
@end
OCSub* sub = [[OCSub alloc] init]; // 'init' is unavailable
Swift 很强调关於 init 的可读性,convenience init
是在 class 提供多种建构器时必须要有的语法提示。在 Objective-C 并没有这样强制的语法,然而对於 Swift 开发者理解的部分我们可以使用 NS_DESIGNATED_INITIALIZER
来提供 Swift interface 关键字。
Objective-C 使用
NS_DESIGNATED_INITIALIZER
来确定建构器的关系。
@available(*, unavailable) init()
与 init() {fatalError()}
在开发者的角度上,你比较偏好哪个?
>>: Day028-透过Vuex-实作简易部落格-修改文章
假设目前有阵列 $fruits = [ ['id'=>0,'fruit'=>'apple...
Hexo 网站设定当中,除了有标题的设定外,还有所谓的「副标题」来辅助主标题外想补充说明的内容。比方...
昨天使用的是在有明确资讯时的例外处理,可以直接使用try catch抓出来,但有时在方法里需要传入资...
前言 走过了资料分析、演算法选择後, 我们得知了有些可以改善模型的方向: 解决资料不平衡(Now) ...
我们目前所学到的状态机已知,我们能透过 transition 限制状态转换的路径 对的 state ...