作者:Erica Sadun,原文鏈接,原文日期:2015-11-15
譯者:JackAlan;校對:小鐵匠Linus;定稿:千葉知風
Swift 的 Playground 可能會莫名其妙地變慢煮岁,尤其當你使用 SpriteKit 或 SceneKit 時讥蔽。盡可能的把代碼遷移到外部資源文件中,可以優(yōu)化編譯并獲得更好的運行時速度画机。
這種方法的最大問題在于冶伞,你會因此失去在 Playground 中的線性流 linear flow
。模塊編譯不支持修改變量的頂層指令步氏。比如响禽,你有類似如下的代碼:
public let lightNode = SCNNode()
lightNode.light = SCNLight()
lightNode.light!.type = SCNLightTypeOmni
lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
scnscene.rootNode.addChildNode(lightNode)
(我很抱歉使用強制解包,但是這是來自蘋果的示例代碼荚醒。)
你不能將這些代碼直接移到一個模塊文件中芋类,因為你使用的是頂級調(diào)用,這些代碼不會在外部 Swift 文件中被編譯界阁。你可能會把這些代碼放在一個函數(shù)里侯繁,來作為一種變通的方法,例如:
internal func setupLightNode() -> SCNNode {
let theLight = SCNNode()
theLight.light = SCNLight()
theLight.light!.type = SCNLightTypeOmni
theLight.position = SCNVector3(x: 0, y: 10, z: 10)
scnscene.rootNode.addChildNode(theLight)
return theLight
}
然后你可以在聲明后調(diào)用該函數(shù):
let lightNode = setupLightNode()
這挫爆了泡躯,這種方式創(chuàng)建了一個不必要的額外函數(shù)贮竟,而且它強制讓你在一個新的實例被聲明前去處理這個實例。
閉包提供了一種更吸引人较剃、相對輕量的解決方案坝锰。正如下面你將看到的樣例。在這里重付,將初始化的代碼打包在一個單獨的組中,執(zhí)行并最終返回完全初始化的實例凫乖。
// create and add a light to the scene
public let lightNode: SCNNode = {
let theLight = SCNNode()
theLight.light = SCNLight()
theLight.light!.type = SCNLightTypeOmni
theLight.position = SCNVector3(x: 0, y: 10, z: 10)
scnscene.rootNode.addChildNode(theLight)
return theLight
}()
這種方法使你可以使用單獨的語句來創(chuàng)建和初始化一個對象,保留你在 Playground 中聲明的流動性和可讀性,而且運行的會更快一點邑商。
這個視頻包含了這次 lightNode 的代碼與其他設置操作殃姓。在點擊 Playground 的 “運行” 按鈕后,只花了 3-4 秒导街,而不像此前的數(shù)分鐘披泪。這種加速方法對于建立以 SpriteKit 和 SceneKit 為元素的原型,在部署到實際的應用前搬瑰,變得更有實際意義款票。
更新:如下是另外一種可以建立類實例的方法:
infix operator ?-> {}
// prepare class instance
func ?-> <T>(object: T, f: (T) -> Void) -> T {
f(object)
return object
}
class MyClass {var (x, y, z) = ("x", "y", "z")}
let myInstance = MyClass() ?-> {
$0.x = "NewX"
$0.y = "NewY"
}
不知你意下如何?
本文由 SwiftGG 翻譯組翻譯泽论,已經(jīng)獲得作者翻譯授權艾少,最新文章請訪問 http://swift.gg。