之前在 這篇文章 看到的。

將自己的 class 來做出一個可以是 optional 的物件,這樣一來使用的時候就必須用 if-letguard 來讀取,在程式上會比較好理解跟處理。

直接上 code:

class FilteredImage {
    ...

    init?(with imageName: String) {
        guard let image = UIImage(named: imageName) else {
            return nil
        }
        self.image = image
    }
}

也就是說在初始化時是用 init? 的方式,確保回傳得到的物件要嘛是 nil 要嘛真的有值,而且對應的屬性也保證有值。

使用上也因為初始化回傳的是 optional 物件,限制了使用者必須用 if-letguard 來拿取:

guard let filteredImage = FilteredImage(with: "bird") else {
    // filteredImage is nil
    return
}

// filteredImage is initialized and we use it normally

然後要保持一個原則,回傳是 nil 一定是因為初始化失敗而得到的,如果是後面的行為造成的話等於權責不分無法抓住問題:

In case where the initialization does not fail, then there is nothing to return; just handle everything as you would do in a normal initializer.