2016-11-22 104 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}'保持你的代码干净,可读,并且提前处理你的错误。 –

相关问题