來一次完整的使用 Playground(一)

PJHubs發表於2019-03-18

原文地址:PJ 的 iOS 開發日常

簡介

在使用 Xcode Playground 進行 WWDC 2019 scholarship 專案的開發時,原本以為 apple 指定的 Xcode 10.1 版本上會有不錯的最佳化,但沒想到跟兩年前使用的效果出奇一致的差勁!!!讓我不僅懷疑,“這是 Apple 開發的工具嗎?”。從我知道 Xcode Playground 開始到現在一直都給我“這是一個神器”的感覺,曾經也嘗試著在給社團同學講解相關開發知識點時使用過 Xcode Playground,但每次想堅持嘗試時都不得不放棄。

接下來,我將介紹一遍我在使用 Xcode Playground 中遇到的問題和解決思路。

怎麼寫啊?

我們建立一個 Single View 的工程,如下圖所示:

新建工程

然後你會看到一個簡潔明瞭的工程樣式:

import UIKit
import PlaygroundSupport

class MyViewController : UIViewController {
    override func loadView() {
        let view = UIView()
        view.backgroundColor = .white

        let label = UILabel()
        label.frame = CGRect(x: 150, y: 200, width: 200, height: 20)
        label.text = "Hello World!"
        label.textColor = .black

        view.addSubview(label)
        self.view = view
    }
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()

OK,程式碼非常容易理解,如果你使用也是 Xcode 10.1 那麼在 PlaygroundPage.current.liveView = MyViewController() 的左邊,會看到一個“播放”鍵,點選它即可執行。

但執行後的介面呢?可以按照下圖箭頭所指向之處,選擇檢視展示方向:

一切正常!這跟之前毫無兩樣,就多了設定一下 PlaygroundPage 的活動檢視而已。此時我們信心滿滿一定能夠玩好 Xcode Playground !結合按照以往的工程習慣,開始對專案進行分層,分模組進行專案的劃分。

問題來了!

正準備按照資料夾的方式在 Sources 資料夾下劃分模組,發現居然無法建立資料夾???是的,在 Xode Playground 無法直接建立資料夾,如果非要建立資料夾,可以在 Finder 中建立。

那好吧,既然沒法方便的場景資料夾那就算了吧~估計 Apple 並不想我們在 Xcode Playground 中進行大工程的開發。這回終於可以開始寫程式碼了!

那就先來把 HomeViewController 給寫了吧。根據示例程式碼你寫出來的程式碼可能會是這樣:

class PJHomeViewController: UIViewController {
    override func loadView() {
        view.backgroundColor = .red
    }
}

下一步在 playground 中使用它!

“嗯?怎麼沒有程式碼提示?好奇怪,算了吧~反正 Xcode 寫 Swift 也會偶爾沒有提示,習慣就好”——這是你在 playground 中寫程式碼時內心可能和自己的對話。憑藉著簡單的類名,我們可以很快的寫出以下程式碼:


import UIKit
import PlaygroundSupport

PlaygroundPage.current.liveView = PJHomeViewController()

等了一會兒後......(可能是一分鐘,可能是 10 秒,也可能 3 秒)

你收到了這樣的一個提示:Use of unresolved identifier 'PJHomeViewController'。告訴你 PJHomeViewController 這個識別符號不存在!

“不可能啊!這不可能啊!”,然後陷入了深深的懷疑當中,“難道我寫了這麼久的 iOS,居然連一個 class 都會建立錯?”。反覆檢視程式碼後,你確實自己寫的確實沒有問題,開始從網上搜尋答案。

終於,你找到了解決方案!Sources 中的類與 playground 並不位於同一 Module 下,我們需要把 PJHomeViewController 暴露出去。你把程式碼修改為了:

import UIKit

public class PJHomeViewController: UIViewController {
    public override func loadView() {
        view.backgroundColor = .red
    }
}

然後再回到 playground 中,執行!嗯?怎麼一直在轉圈?重啟 Xcode!嗯?怎麼還是不行?檢查程式碼,然後你發現了在 loadView 並沒有給 view 設定 frame,看來是自己的學術不精。修改後程式碼為:

import UIKit

public class PJHomeViewController: UIViewController {
    public override func loadView() {
        view = UIView(frame: CGRect(x: 0, y: 0, width: 375, height: 667))
        view.backgroundColor = .red
    }
}

此時再執行工程,我們終於看到了紅色的畫面!吐了一口氣~

準備大幹一場!

摸熟套路後,我們終於可以大幹一場了!

在大幹一場一場的過程中,你會被“程式碼提示怎麼又沒有了?!”“報錯異常怎麼還不消失?”“執行怎麼需要這麼久?”“檔案刪除後怎麼一直沒更新目錄?”等問題困擾,所以!

我十分推薦大家優先使用 Xcode 進行原始碼的編寫和除錯,在 playground 中進行編碼和除錯都是一個“十分痛苦”的體驗,如果再加上你的裝置比較差勁的話,那 Xcode Playground 的“實時預覽”的效果幾乎可以說廢掉了。

關於 Xcode Playground 的實現猜測是跑在了一個單獨的程式中做檔案差分編譯,所以才會導致在某些情況下出現“卡死”甚至 Xcode 整個崩掉的情況。

但是這個情況在 iPad 上完全沒有,可以嘗試使用使用 Swift Playground 而不是 Xcode Playground

總結

Xcode Playground 的優勢很大,但就目前來看劣勢在慢慢縮短,我在使用 2015 款的 15-inch 高配的 MBP 和 2017 款的 15-inch 高配兩款機器下的 Xcode Playground 對老款機器十分不友好,讓我舉步維艱,最後放棄轉而使用 Xcode 開發完再丟入 Xcode Playground 進行效果檢視。

下篇文章中將完整的介紹我的 WWDC 2019 scholarship 專案完整內容。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
優秀的人遵守規則,頂尖的人創造規則

相關文章