默认值不会设置为 Nil? - 斯威夫特

时间:2021-02-09 13:26:17

标签: ios swift swiftui optional

如何将默认值设为 nil? 我试图在 func stockInfoPerDay(jsonData: StockInfo?)func stockInfoSingleDay(singleJSONData: StockInfoOneDay?) 中使 StockInfo 可选,但这让我在 for 循环中遇到麻烦......它在强制解包时没有显示错误,但我想不要强制解包。

.onAppear(){
            stockInfoPerDay(jsonData: jsonData ?? nil) <---- *'nil' is not compatible with expected argument type 'StockInfo'*
            stockInfoSingleDay(singleJSONData: singleJSONData ?? nil) <---- *'nil' is not compatible with expected argument type 'StockInfoOneDay'*
        }


static var pricesForOneMonth: [CGFloat] = []

static var priceForOneDay: [StockInfoOneDay] = []

func stockInfoPerDay(jsonData: StockInfo) {
    
    CropPriceView.pricesForOneMonth.removeAll()
    
    for data in jsonData.data{
        CropPriceView.pricesForOneMonth.append(CGFloat(data.close))
    }   
}

func stockInfoSingleDay(singleJSONData: StockInfoOneDay){
    
    CropPriceView.priceForOneDay.removeAll()
    
    CropPriceView.priceForOneDay.append(singleJSONData)
}

2 个答案:

答案 0 :(得分:1)

您不能将 nil 传递给函数参数,除非该参数是 Optional。你需要重写你的函数来接受一个可选的:

func stockInfoPerDay(jsonData: StockInfo?) {
    
    guard let jsonData = jsonData else { return } //Exit if you are passed a nil.
    CropPriceView.pricesForOneMonth.removeAll() //Move this above the guard if you want to empty the CropPriceView when you are passed a nil.
    
    for data in jsonData.data{
        CropPriceView.pricesForOneMonth.append(CGFloat(data.close))
    }   
}

请注意,您可以处理此问题的另一种方法是单独保留 stockInfoPerDay() 函数,并使用“可选绑定”(if let)仅在参数不为 nil 时调用您的函数:

.onAppear(){
    if let validJsonData = jsonData {
        stockInfoPerDay(jsonData: validJsonData) 
    }
    if let validSingleJSONData = jsonData {
        stockInfoSingleDay(singleJSONData: validSingleJSONData) 
    }
}

答案 1 :(得分:0)

您需要理想地设置它,以便您的函数接受可选项作为参数并处理函数中的 nil 情况,通常使用保护语句。但是,既然你说你有这个问题,我不知道那个问题是什么,我只能建议你把代码改成这样

stockInfoPerDay(jsonData: jsonData ?? StockInfo()) // <- Just make sure you have a good default initializer for the StockInfo object. Handle the possibility that jsonData was nil and StockInfo is empty inside the stockInfoPerDay function.
stockInfoSingleDay(singleJSONData: singleJSONData ?? StockInfoOneDay())

让我知道这是否有帮助。