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

Posted

技术标签:

【中文标题】默认值不会设置为 Nil? - 斯威夫特【英文标题】:Default value won't set to Nil? - Swift 【发布时间】:2021-02-09 13:26:17 【问题描述】:

如何将默认值设为 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)

【问题讨论】:

如果你想让一个参数成为可选的,那么你还需要处理它为 nil 的情况,也许使用guard 语句。所以决定当它为 nil 时应该发生什么,并编写代码来处理这种情况。 【参考方案1】:

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

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)仅在参数不为零时调用您的函数:

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

【讨论】:

【参考方案2】:

您需要理想地设置它,以便您的函数接受可选参数作为参数并处理函数中的 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())

如果有帮助,请告诉我。

【讨论】:

以上是关于默认值不会设置为 Nil? - 斯威夫特的主要内容,如果未能解决你的问题,请参考以下文章

如何检查零值?即使考虑了 nil 值,应用程序也会崩溃。斯威夫特 [重复]

swift 可选项(Optional)

如何将空值设置为结构的默认值

如何将 JSON 令牌保存到用户默认值,然后在不同的视图中使用它?斯威夫特 4

如何在 Ruby 中为 splat 参数设置默认值

传入值为 nil 的函数参数的默认值