[27] 30 天从 Swift 学会 Objective-C:Swift friendly 的 Unavailable 与 convenience init

物件导向的设计中,关於建构物件的方式我们成为建构器(constructor),这关系到物件使用的方式,是很重要的事情。

Photo by @kellysikkema on Unsplash

Unavailable 与 NS_UNAVAILABLE

而 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

Objective-C 是使用 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

复习 convenience init

Swift 很强调关於 init 的可读性,convenience init 是在 class 提供多种建构器时必须要有的语法提示。在 Objective-C 并没有这样强制的语法,然而对於 Swift 开发者理解的部分我们可以使用 NS_DESIGNATED_INITIALIZER 来提供 Swift interface 关键字。

Objective-C 使用 NS_DESIGNATED_INITIALIZER 来确定建构器的关系。

简单测验

  1. @available(*, unavailable) init()init() {fatalError()} 在开发者的角度上,你比较偏好哪个?

<<:  Day27 机房好狗结果展示(7)

>>:  Day028-透过Vuex-实作简易部落格-修改文章

[Day 29] PHP array_map

假设目前有阵列 $fruits = [ ['id'=>0,'fruit'=>'apple...

Day 16:Next 布景客制化 - 让副标题显示於标题内

Hexo 网站设定当中,除了有标题的设定外,还有所谓的「副标题」来辅助主标题外想补充说明的内容。比方...

Day26练习java-抛出例外

昨天使用的是在有明确资讯时的例外处理,可以直接使用try catch抓出来,但有时在方法里需要传入资...

[Day 17] 我的资料哪有这麽平衡!第二季 (class weights)

前言 走过了资料分析、演算法选择後, 我们得知了有些可以改善模型的方向: 解决资料不平衡(Now) ...

Day15 - 守护你的状态转移 : Guard

我们目前所学到的状态机已知,我们能透过 transition 限制状态转换的路径 对的 state ...