我想说一个股票价格,然后在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))
}
}
答案 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)
如果我最初正确地理解并复制了您的代码,您已经知道了
这是一个解决方案(已通过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可以在显示时相应地显示它们。在第二个选项上,您将首先具有一个空价格数组,然后将其分配给生成的价格。
(我知道第二个选项不会在加载视图之前 计入初始化值,但我只是想为您提供一些选项)