2016-11-22 105 views
0

我下面this教程和啓動項目包括與此代碼一個UITableViewCell類:這是一個變量還是一個函數?或兩者?

var product: SKProduct? { 
    didSet { 
    guard let product = product else { return } 

    textLabel?.text = product.localizedTitle 

    if RageProducts.store.isProductPurchased(product.productIdentifier) { 
     accessoryType = .checkmark 
     accessoryView = nil 
     detailTextLabel?.text = "" 
    } else { 
     ProductCell.priceFormatter.locale = product.priceLocale 
     detailTextLabel?.text = ProductCell.priceFormatter.string(from: product.price) 

     accessoryType = .none 
     accessoryView = newBuyButton() 
    } 
    } 
} 

這看起來像沒有參數的函數。我以前從來沒有看到過帶有外殼的變量。第一行是var語句,但啓動了一個機箱:

var product: SKProduct? { 

任何人都可以解釋這一點嗎?

+2

戴夫,Stack Overflow是不適合初學者資源的替代學習斯威夫特。這在Swift語言指南中詳細介紹,以及大量免費資源。 – Alexander

+0

@AlexanderMomchliov這不是真的。 StackOverflow是一個論壇,無論用戶做什麼。你會發現許多比這更基本的東西的解釋,一些如何創建或編輯數組很簡單。更重要的是,這些類型的問題通常有10倍以上的觀點和10倍多的贊成票。 「Swift語言指南」中涵蓋的東西已經被問及在這裏愉快地回答。你真的要去告訴新的程序員不要問「爲什麼變量會附加一個函數」?只要下一次按下後退按鈕並保存呼吸。 –

+1

我並不是說你的評論不屬於SO。我是說,你將有一個更容易的時間通過一個很好的初學者資源去學習斯威夫特,而不是拿起一個先進的之一,並訴諸SO問題,填補了作者(故意)採取是基本信息的孔承擔知識。 – Alexander

回答

3

在這個例子中,product是可變的,並且是didSet的函數。更具體地,didsetproperty observer。從蘋果公司的文檔:

地產觀察者觀察,在屬性值的變化。地產觀察家稱爲每一個屬性的值設置時間,即使新的值相同屬性的當前值。

所以didSet裏面的代碼就會得到執行你犯了一個變量賦值,就像任何時間:

product = someSKProduct 
+0

你介意也解決了爲什麼有需要,首先後衛說法,他則使得產品=產品?如果那樣像一個零檢查? –

+1

@DaveG無效支票就是這樣。如果它是'nil',那麼解開可選項並提前退出。 – EmilioPelaez

+1

@DaveG肯定的事情! Swift的可選綁定是該語言的另一個功能,旨在減少您編寫的代碼量並保持清潔。最初,你會寫'if product!= nil',但這會讓你的if語句檢查你不想要的東西,這不是超級可讀的。接下來,你可以做'if let product = product',但是你會在'else'塊中將錯誤邏輯放在這個函數的底部,這也會降低可讀性。 'guard let product = product else {return}'保持你的代碼乾淨,可讀,並且提前處理你的錯誤。 –

相關問題