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 范围界定问题的主要内容,如果未能解决你的问题,请参考以下文章

您是不是使用花括号进行额外的范围界定? [关闭]

关于Random.Range 范围界定

项目范围管理

过滤从 `datatable` 界定的 `datagridview` 中的数据

如何界定标准化管理与非标准化管理

项目整体管理包含哪些内容和过程?