Swift 范围界定问题
Posted
技术标签:
【中文标题】Swift 范围界定问题【英文标题】:Swift scoping issue 【发布时间】:2014-11-21 02:26:11 【问题描述】:我有一个应用程序从 parse.com 数据库中提取信息并将其传递到数组中。当我从 while 循环内部 println() 这个数组时,它打印得很好。当我尝试在 while 循环之外打印它时,它返回空。这是我的代码:
var players = [String]()
var total = [String]()
var addTotal:AnyObject!
var addTotalFinal:Int!
var addPlayers:AnyObject!
var addPlayersFinal:Array<Int>!
@IBOutlet weak var tableView: UITableView!
var test: AnyObject!
override func viewDidLoad()
super.viewDidLoad()
Parse.setApplicationId("KZ758LUTQZQ9Kl69mBDkv7BNLGHyXeKmqtFf7GmO", clientKey: "lOK5rg7wKeTRXZGV7MZBlQ5PTpNlGO0mkgtLkLgH")
var query = PFQuery(className:"runningTotal")
query.whereKey("total", notEqualTo: 0)
query.findObjectsInBackgroundWithBlock
(objects: [AnyObject]!, error: NSError!) -> Void in
if error == nil
var i = 0
while i < objects.count
self.addTotal = objects[i]["total"]
self.addTotalFinal = self.addTotal as Int
self.addPlayers = objects[i]["players"]
self.addPlayersFinal = self.addPlayers as Array
self.players.append("\(self.addPlayersFinal)")
self.total.append("\(self.addTotalFinal)")
++i
else
navigationItem.title = "\(players)"
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return players.count
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
var cell = tableView.dequeueReusableCellWithIdentifier("MyCell", forIndexPath: indexPath) as UITableViewCell
cell.textLabel.text = "\(players[indexPath.row]) - \(total[indexPath.row])"
return cell
while语句中的println()返回
[[1, 11, 12, 24, 25]]
[2]
[[1, 11, 12, 24, 25], [1, 5, 24, 25, 31]]
[2, 4]
[[1, 11, 12, 24, 25], [1, 5, 24, 25, 31], [2, 12, 25, 15, 31]]
[2, 4, -1]
[[1, 11, 12, 24, 25], [1, 5, 24, 25, 31], [2, 12, 25, 15, 31], [24, 22, 25, 31, 20]]
[2, 4, -1, -6]
[[1, 11, 12, 24, 25], [1, 5, 24, 25, 31], [2, 12, 25, 15, 31], [24, 22, 25, 31, 20], [1, 2, 3, 4, 5]]
[2, 4, -1, -6, 5]
[[1, 11, 12, 24, 25], [1, 5, 24, 25, 31], [2, 12, 25, 15, 31], [24, 22, 25, 31, 20], [1, 2, 3, 4, 5], [1, 10, 11, 2, 12]]
[2, 4, -1, -6, 5, 1]
这是有道理的,因为有六次迭代。但是,如果我在 viewDidLoad 语句中而不是在 while 语句中打印,它会返回 [][]
非常感谢任何帮助。
【问题讨论】:
viewDidLoad statement
里面的“什么意思?”
“while 语句中的 println()”我看不到 println()
anyhwere。
我的意思是把它放在整个 parse 语句之外,就在 viewDidLoad 语句中的右括号之前
在您的代码中显示它。没有人能猜到你可能在做什么。没有人应该这样做。展示你正在在做什么。
显示您正在打印的什么以及您正在打印的哪里。显示你的真实代码。
【参考方案1】:
问题是你还没有理解线程/异步执行是如何工作的。让我们更简单。这是伪代码:
func viewDidLoad
doStepOne() // you configure your query here
doStepTwoWithAsynchBlock
doStepTwo() // your while loop is here
doStepThree() // your failing println is here
这按doStepOne()
、doStepThree()
、doStepTwo()
的顺序执行。因此,如果doStepThree()
尝试获取doStepTwo()
设置的值,它还没有准备好。
异步块是将发生的事情,在未来的某个时间 - 在你所有其他代码都完成之后,包括viewDidLoad
的其余部分.
【讨论】:
明白了。那么我如何将它应用到我当前的代码中呢? 它是您当前的代码。您正在尝试获取self.players
在它被赋予一个值之前。那是行不通的!
啊,我明白了。所以只是为了澄清,要修复它,我需要做些什么来确保它在被赋予价值之前不会被获取?
如果你在viewDidLoad
,它被赋值的唯一地方是在while
循环之后但在背景块内。
这是我最关心的理解! :) 这是一个非常重要的概念,所以如果你掌握了它,你就已经向前迈出了一大步。以上是关于Swift 范围界定问题的主要内容,如果未能解决你的问题,请参考以下文章