我已经遇到这种愚蠢的行为,在 swift中,强制解包可选不传播.

从文档:

Trying to use ! to access a non-existent optional value triggers a runtime error. Always make sure that an optional contains a non-nil value before using ! to force-unwrap its value.

复制:

func foo(bar:String?) throws{
    print(bar!);
}

try foo(nil);

这似乎不符合逻辑或一致,我找不到有关这个问题的任何文件.

这是设计吗?

解决方法

从 documentation:

Error Handling

Error handling is the process of responding to and recovering from
error conditions in your program. Swift provides first-class support
for throwing,catching,propagating,and manipulating recoverable
errors at runtime.

Representing and Throwing Errors

In Swift,errors are represented by values of types that conform to
the ErrorType protocol. This empty protocol indicates that a type can
be used for error handling.

(注意:在Swift 3中,ErrorType已重命名为Error)

所以使用try / catch可以处理抛出的Swift错误(符合ErrorType协议的类型的值).
这与运行时错误和运行时异常完全无关
(也与基金会图书馆的NSException无关).

请注意,关于错误处理的Swift文档甚至不使用
字“异常”,唯一的例外(!)在(强调我的)在:

NOTE

Error handling in Swift resembles exception handling in other
languages,with the use of the try,catch and throw keywords. Unlike
exception handling in many languages—including Objective-C—error
handling in Swift does not involve unwinding the call stack,a process
that can be computationally expensive. As such,the performance
characteristics of a throw statement are comparable to those of a
return statement.

不包括任何选项的解开不会抛出
Swift错误(可能会传播),无法处理
尝试.

你必须使用众所周知的技术可选绑定,可选链接,检查对等

ios – 迅速强制解包异常不传播的更多相关文章

  1. 用swift实现navigation bar的完全透明 & navigation bar中button的字体大小调整

    2>或者我们可以来改变这个返回按钮的样式,比如手动把它的文字字体大小调整下注意,因为我们其实是改变的UIBarButtonItem,所以,这段代码我们要放到Appdelegate中来实现。这样,所有的bar中的button类的字体都被强制设定为12号大小了

  2. swift – 如何解开任意类型的可选值?

    给定一个[Any]的数组,其中包含可选值和非可选值,例如:我们如何提取在Any类型(如果有)的Optional的值,所以我们可以创建一个通用打印函数,只打印出值。这个printArray函数遍历并打印每个元素:其中将输出:我们如何更改它,以便它只打印底层值,以便它解包的值,如果它是可选的?将总是解包任何类型。

  3. swift – 从常规方法调用协议默认实现

    我想知道是否可能实现这样的事情。它在某种程度上类似于调用super。类中的方法来满足实现每个属性的需求等,但是我看不到使用struct实现相同的可能性。我不知道你是否仍然在寻找这个答案,但方法是从协议定义中删除该函数,将对象转换为Foo,然后调用它的方法:由于某种原因,它只有在函数未声明为协议的一部分,而是在协议的扩展中定义时才有效。

  4. swift – 使用依赖于其他实例变量的值初始化惰性实例变量

    我已经例如尝试将getEventCalendar从方法转换为函数,但这也无济于事.你可以使用一次只执行的闭包来捕获self的属性并在执行时使用它们.例如.W.r.t.对于你自己的尝试:你可以以同样的方式在这个曾经执行过的闭包中使用self的帮助(实例)函数.

  5. 泛型 – 如何在Swift的泛型类上实现NSCoding?

    我在Swift中遇到泛型类和NSCoding问题.具体来说,这个示例代码很好地工作:但是,当我尝试相同的代码,并添加一个泛型参数;当我尝试编码对象;我收到一个’无法识别的选择器发送到实例’错误:以下是错误详细信息和堆栈跟踪:当我读到这一点,当类是通用的时,Swift无法调用encodeWithCoder的实现.它是否正确?为了在泛型类上使用NSCoding,我该如何解决这个问题?

  6. 在Swift 3中如何记录函数的闭包参数的参数?

    在Xcode8beta和Swift3中,当您有一个以闭包为参数的方法时,例如:如何记录关闭所需的参数?据我所知,如果您标记它们,您只能记录关闭参数:这是不太理想的:它强制您在调用闭包时使用参数标签,如果有命名冲突,似乎没有办法区分两者.编辑:as@Arnaud指出,您可以使用_来阻止在调用闭包时使用参数标签:事实上,这是Swift3中唯一有效的方法,因为参数标签不再是类型系统的一部分.

  7. 如何以即时模式从其他.swift文件中包含.swift文件?

    具有功能定义bar.swift的文件:一个脚本可以立即运行foo.swift:如何从foo.swift导入bar.swift的foo()函数?我认为现在的答案是你不能分割多个文件的代码,除非你编译代码.使用#!

  8. Swift枚举具有相同值的多个案例

    在C中,你可以使你的枚举有这个在迅速我想做相当的.但编译器抱怨说它不是唯一的.我如何告诉我,我想要两个案例具有相同的价值?我试过了和但它似乎不像我想要的那样工作.我感谢任何帮助.Swift不支持重复的值.如果您不介意,可以使用这样的东西来模拟它.

  9. swift – 有客观原因我不能拥有带元素标签的单元素元组吗?

    在Swift中直到并包括Swift3,我无法创建一个单元素元组,其中元素被命名.所以funcfoo()–>酒吧很好,而funcfoo()–>产生编译错误.但是,我可以想到这种模式的一些可能用途,例如:…这已经作为SwiftEvolution系统的一部分进行了讨论吗?

  10. swift – 多个让一个守卫声明和一个let一样吗?

    这些在Swift3中有所不同.在这种情况下:你说’可选–解开foo吧.如果成功,可选择将taco打包成qux.如果成功继续.其他……

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部