Struct属性关闭仅在Swift中运行一次

时间:2018-12-17 08:08:48

标签: ios swift struct

有任何想法让闭包仅运行一次。

每次我打电话给APIResultpriceSortedItems属性将显示“ 123”。我想让它运行一次以减少内存使用量。谢谢。

struct APIResult {

    var aryItem = [Item]()

    var priceSortedItems: [Item] {

        print("123")

        let sortedItems = self.aryItem.sorted(by: { (item1, item2) -> Bool in
            Double(item1.Value)! > Double(item2.Value)!
        })

        return sortedItems
    }
}

3 个答案:

答案 0 :(得分:2)

您的财产用 getter 算作财产。这意味着每次需要获取变量时,getter中的代码都会执行,并且会从 getter 中获取新值。

如果您只想初始化一次变量,请使用lazy变量,该变量在需要时被初始化一次:

lazy var priceSortedItems: [Item] = {

    print("123")

    let sortedItems = self.aryItem.sorted(by: { (item1, item2) -> Bool in
        Double(item1.Value)! > Double(item2.Value)!
    })

    return sortedItems
}()

答案 1 :(得分:1)

如果priceSortedItems更改后要更新aryItem。您应该这样做。

struct APIResult {

    var aryItem = [Item]() {
        didSet {
            priceSortedItems = aryItem.sorted(by: { (item1, item2) -> Bool in
                Double(item1.Value)! > Double(item2.Value)!
            })
        }
    }

    var priceSortedItems = [Item]()
}

答案 2 :(得分:0)

func priceSortedItems() ->[Item] {

    print("123")

    let sortedItems = self.aryItem.sorted(by: { (item1, item2) -> Bool in
        Double(item1.Value)! > Double(item2.Value)!
    })

    return sortedItems
}

您可以将其创建为函数。