Swift   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Swift中的NSCalendar – init可以返回nil,但不是可选的大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

如果calendarName无效,则nSCalendar(calendarIdentifier:calendarName)可以返回nil – 这是原始的Objective-C行为,在 Swift中也是如此.但是,似乎编译器认为初始化程序返回NSCalendar而不是NSCalendar?,如下所示: let c1 = NSCalendar(calendarIdentifier: "gregoria
如果calendarName无效,则nSCalendar(calendarIdentifier:calendarName)可以返回nil – 这是原始的Objective-C行为,在 @L_801_0@中也是如此.但是,似乎编译器认为初始化程序返回NSCalendar而不是NSCalendar?,如下所示:
let c1 = NSCalendar(calendarIdentifier: "gregorian")// _NSCopyOnWriteCalendarWrapper
let c2 = NSCalendar(calendarIdentifier: "buddhist")// _NSCopyOnWriteCalendarWrapper

//let c3:NSCalendar = NSCalendar(calendarIdentifier: "rubbish") // run-time error
let c3:NSCalendar? = NSCalendar(calendarIdentifier: "rubbish") // nil

因此,如果初始化程序可以返回nil,我的理解是我应该能够做到

if let c4 = NSCalendar(calendarIdentifier: "rubbish") as? NSCalendar { 
    //error: conditional downcast from 'NSCalendar' to 'NSCalendar' always succeeds
}

但是,这是一个编译时错误,如图所示.

在这里误解了什么,如何安全地测试命名日历实际存在?

注意:以下仅适用于Swift 1.0.在Swift 1.1中,有可用的初始化器.

这有效:

if let c4 = NSCalendar(calendarIdentifier: "rubbish") as NSCalendar? { 

}

在Swift 1.0中,Xcode发行说明中存在一个已知问题,即Swift不支持返回nil的Objective-C初始值设定项.基本上,正在发生的事情是,根据Swift语言,表达式NSCalendar(…)具有类型NSCalendar,这是一种非可选类型(不能是nil).但是,这实际上是Objective-C的导入初始化程序,它可以返回nil.

所以当前发生的是当你调用并返回nil时,你有一个在运行时为零的值,但Swift认为是一个非可选的NSCalendar(不能为零).这是一个非常糟糕的情况,你有一个类型不可能的值. Xcode发行说明提到了一种“解决方法”,您可以在使用它之前将初始化程序的结果转换为可选类型.这样做的原因是在运行时,可选和非可选对象指针都表示为简单指针,其中nil对象指针是空指针,而非可选对象指针不是空指针.从非可选对象指针转换为可选对象指针的操作是一个简单的赋值(在两种情况下它都是非空指针).但是在值为nil的情况下,简单赋值将其转换为可选类型的(有效)nil值.一切都很开心.

但是如果你不首先将它转换为可选的,那么所有的地狱都会破裂,因为你有一个不应该为那种类型的值.

你尝试使用as?从NSCalendar到NSCalendar是不允许的,因为从NSCalendar到NSCalendar的强制转换不能失败(理论上).

大佬总结

以上是大佬教程为你收集整理的Swift中的NSCalendar – init可以返回nil,但不是可选的全部内容,希望文章能够帮你解决Swift中的NSCalendar – init可以返回nil,但不是可选的所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。