原文地址: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 協議》,轉載必須註明作者和本文連結