在加载视图之前,如何在SwiftUI中初始化值?

时间:2020-05-27 02:12:24

标签: swift swiftui

我想说一个股票价格,然后在2D数组中生成0.05%以内的值。

我正在传递诸如股票名称和股价之类的股票信息。

但是当我尝试运行一个创建2D值数组的方法时,在属性初始化器中遇到了“无法使用实例成员”;在“ self”可用之前运行属性初始化器”

我一直在寻找解决方法。

假设亚马逊股票为2400。此数据传递到新视图中。我想做的是在2400(可能是2405和2395)附近创建一个值的2D数组。我希望在新视图中生成这些值的2D数组。但是我收到一个错误,我无法在加载视图之前生成值,但是我需要它们来生成视图。

我认为我必须使用init方法,但不确定如何使用。

这是引发上面错误的行。

var new_prices = generateValues(price: position.stock_price)

这是方法

func generateValues(price: Double) -> [[Double]] {
    var values = [[Double]]()
     for x in 1...5 {
        values[0][x-1] = (price + price * 0.005 * Double(x))
    }
    return values
}

这是在库存位置传递的内容

struct Position : Identifiable {
    var id = UUID()
    var stock_name: String
    var stock_ticker: String
    var stock_price: Double
    var price_paid: Double

}

传递的参数引发了一个无参数init()错误。

struct PositionDetail_Previews: PreviewProvider {
    static var previews: some View {
        PositionDetail(position: Position(stock_name: "Amazon", 
stock_ticker: "AMZN", stock_price : 2400, price_paid : 2300))
    }
}

4 个答案:

答案 0 :(得分:2)

您可以

struct ContentView: View{
@State var new_prices = [[Double()]]
        init () {
            new_prices = generateValues(price: position.stock_price)
        }
    var body: some View{
           your view...
     }
}

答案 1 :(得分:0)

如果我最初正确地理解并复制了您的代码,您已经知道了

demo

这是一个解决方案(已通过Xcode 11.4 / iOS 13.4测试)

func generateValues(price: Double) -> [[Double]] {
    var values = [[Double]]()
    for x in 1...5 {
        values[0][x-1] = (price + price * 0.005 * Double(x))
    }
    return values
}

struct PositionDetail: View {
    var position: Position
    var new_prices: [[Double]]

    init(position: Position) {
        self.position = position
        self.new_prices = generateValues(price: position.stock_price)
    }

    var body: some View {
        VStack { // << just for demo
            Text("Position: \(self.position.stock_name)")
            Text("First price: \(self.new_prices[0][0])")
        }
    }
}

其他代码未更改。

答案 2 :(得分:0)

这是调用动态函数以初始化SwiftUI View数据的当前版本的方式。 (注意:不需要.init()):

import SwiftUI

struct Position : Identifiable {
    var id = UUID()
    var stock_name: String
    var stock_ticker: String
    var stock_price: Double
    var price_paid: Double
}

struct PositionDetail: View {
    var position: Position

    func generateValues(price: Double) -> [[Double]] {
        var values: [[Double]] = Array(repeating: Array(repeating: 0, count: 5), count: 1)

        for x in 1...5 {
            values[0][x-1] = (price + price * 0.005 * Double(x))
        }

        return values
    }

    var body: some View {
        let values   = generateValues(price: position.stock_price)

        return HStack {
            ForEach(values, id:\.self) { row in
                HStack {
                    ForEach(row, id: \.self) { value in
                        Text("\(value)")
                    }
                }
            }
        }
            .frame(maxWidth: .infinity, maxHeight: .infinity)
    }
}


struct PositionDetail_Previews: PreviewProvider {
    static var previews: some View {
        PositionDetail(position: Position(stock_name: "Amazon", stock_ticker: "AMZN", stock_price : 2400, price_paid : 2300))
    }
}

注意:generateValues函数已损坏,...

答案 3 :(得分:0)

使用位置模型:

struct Position : Identifiable {
    var id = UUID()
    var stock_name: String
    var stock_ticker: String
    var stock_price: Double
    var price_paid: Double

}

在给定现有位置的情况下,您可以在创建视图时生成值:

struct StockPriceViewBeforehand: View {
    // MARK: Properties
    var position: Position
    var newPrices: [[Double]]

    // MARK: Body
    var body: some View {
        Text("Use prices here")
    }
}

struct StockPriceViewBeforehand_Previews: PreviewProvider {
    static var previews: some View {
        let amznPosition = Position(stock_name: "Amazon", stock_ticker: "AMZN", stock_price : 2400, price_paid : 2300)        
       return StockPriceViewBeforehand(position: amznPosition, newPrices: StocksValueGenerator.generateValues(price: amznPosition.stock_price))
    }
}


final class StocksValueGenerator {
    static func generateValues(price: Double) -> [[Double]] {
        var values = [[Double]]()
        for x in 1...5 {
            values[0][x-1] = (price + price * 0.005 * Double(x))
        }
        return values
    }
}

请注意,我将generateValues方法用作上述StocksValueGenerator类的静态函数,但是您可以根据需要使用它。

作为替代方案,您可以在视图出现时调用generate values方法:

struct StockPriceView: View {
    // MARK: Properties
    var position: Position
    @State var values = [[Double]]()

    // MARK: Body
    var body: some View {
        Text("Your view here")
            .onAppear {
                self.values = self.generateValues(price: self.position.stock_price)
            }
    }

    // MARK: Methods
    func generateValues(price: Double) -> [[Double]] {
        var values = [[Double]]()
        for x in 1...5 {
            values[0][x-1] = (price + price * 0.005 * Double(x))
        }
        return values
    }
}

struct StockPriceView_Previews: PreviewProvider {
    static var previews: some View {
        let amznPosition = Position(stock_name: "Amazon", stock_ticker: "AMZN", stock_price : 2400, price_paid : 2300)

        return StockPriceView(position: amznPosition)
    }
}

这两个选项之间的区别在于,在第一个选项中,您将使用已经生成的newPrices创建View,因此View可以在显示时相应地显示它们。在第二个选项上,您将首先具有一个空价格数组,然后将其分配给生成的价格。

(我知道第二个选项不会在加载视图之前 计入初始化值,但我只是想为您提供一些选项)