使用范围外范围内的数据

Posted

技术标签:

【中文标题】使用范围外范围内的数据【英文标题】:Use data from a scope outside of the scope 【发布时间】:2016-03-22 10:13:07 【问题描述】:

我正在尝试在 iPhone 应用程序中使用来自网站的文本。为此,我使用网络 scraper ,Osmosis。我设法检索了我想要的数据,但我不能将数据影响到一个数组,以便在函数之外使用它。这是我所做的一个 sn-p:

class ViewController: UIViewController 

    @IBOutlet weak var quote: UILabel!
    
    private var array: [[String: AnyObject]] = []
    

    var initArray: [[String: AnyObject]] 
        get 
            return array
        
        set 
            for e in self.initArray 
                array.append(e)
            
        
    

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        getQuotes()
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    
    
    func getQuotes()
        
        Osmosis(errorHandler:  (error) -> Void in
            print(error)
        )
            .get(NSURL(string: "http://www.example.com")!)
            .find(OsmosisSelector(selector: ".parentDiv"), type: .CSS)
            .populate([
                OsmosisPopulateKey.Single("quotes") : OsmosisSelector(selector: ".childDiv")
                ], type: .CSS)
            .list  (dict) -> Void in
                self.array.append(dict)
                print(self.initArray) // this prints data
            
            .start()
        print(self.initArray) // This prints an empty array
    

我认为我不能使用该数组,因为它填充在 Osmosis() 的 init 中,但我想知道如何在我的代码中的其他地方使用它。你能解释一下我的代码中发生了什么(为什么我只能使用.list()中的数据)以及如何解决这个问题。

编辑: 我尝试使用 getter 和 setter 来检索范围之外的数据,但结果与没有 getter/setter 相同。

【问题讨论】:

我知道我的标题根本不明确,但我不知道如何更准确。如果您找到更好的标题,请继续更改它。干杯 您遇到的一个问题是您的array 属于[[String: AnyObject]] 类型,而您的quotesArray 属于同一类型,但您尝试将array 附加到quotesArray:它可以不行。如果你想将一个字典数组附加到一个新的容器数组中,这个容器的类型应该是[[[String: AnyObject]]],但我不确定这真的是你想要做的...... 另一个问题是 print(self.array) 在 Osmosis 闭包的范围之外,所以你正在查看它,而它还没有被填充 所以你认为它是空的。将print(self.array) 放在.list 块内,就在右大括号之前的空行中。 感谢您的回答@EricD。我知道在范围内打印我的数组会起作用,但我的目标是使用范围外的数据。 我试图将quotesArray的类型更改为[[[String: AnyObject]]],但是当我打印它时它会打印一个空数组... 【参考方案1】:

您想将一个数组的所有元素添加到另一个数组吗?

for e in quotesArray 
    self.array.append(e)

self.array.appendContentsOf(quotesArray)

【讨论】:

我确实想将array 的元素添加到quotesArray。我尝试了您的两种解决方案,但它打印了一个空数组... 你确定你的 api 不是异步的吗?您是否在追加后立即添加打印? 我的猜测是 api 是异步的,我在范围之外打印,因为我希望我的数据在任何地方都可用。 您必须在计算完成后放置所有取决于计算结果的逻辑。打印必须在 .list 内吗 通过在计算完成后放置逻辑,您的意思是我必须在渗透范围之外填充我的数组?如果这就是你的意思,我尝试这样做,但它返回一个空数组。【参考方案2】:

根据 Christian Dietrich 的回答和 cmets,我设法通过更新我范围内的 UI 来解决我的问题。

这是我所做的:

import UIKit
import Osmosis

class ViewController: UIViewController 

    @IBOutlet weak var quote: UILabel!

    var array: [[String: AnyObject]] = []

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        getQuotes()
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    func getQuotes() 

        var updateText: String = ""

        Osmosis(errorHandler:  (error) -> Void in
            print(error)
        )
            .get(NSURL(string: "http://www.exemple.com")!)
            .find(OsmosisSelector(selector: ".wrapper"), type: .CSS)
            .populate([
                OsmosisPopulateKey.Single("div") : OsmosisSelector(selector: ".div")
                ], type: .CSS)
            .list  (dict) -> Void in
                self.array.append(dict)
                updateText = self.array[0]["div"] as! String
                self.quote.text = updateText
                self.view.setNeedsDisplay()
            
            .start()
    

感谢您的帮助!

【讨论】:

以上是关于使用范围外范围内的数据的主要内容,如果未能解决你的问题,请参考以下文章

习题6-3 使用函数输出指定范围内的完数 (20 分)

[PTA]习题6-3 使用函数输出指定范围内的完数

[PTA]习题6-3 使用函数输出指定范围内的完数

正则表达式获取除范围外的所有数字

限制 UIAppearance 代理范围

AutoCAD框选不在可见范围内的对象