首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    窥探Swift编程之错误处理与异常抛出

    一、主动退出程序的几种情况 在Objective-C中,在单元测试时我们会使用断言,断言中条件满足时会产生异常,并打印出相应的断言错误,在Swift中也有几种产生异常的语法。...二.Swift中的错误处理 在Objective-C中,如果你处理过错误的话,那么你将会对NSError很熟悉。在Swift中,如果你要定义你自己的错误类型,你只需要实现ErrorType协议即可。...声明完错误类型后,就可以在处理错误抛出异常时使用自定义的错误类型了。下方将会一步步带你走完Swift中的错误处理的路程。 1.使用枚举创建错误类型 (1).遵循ErrorType协议,自定义错误类型。...在声明枚举时,我们使用了枚举元素值绑定的特性(关于枚举使用的更多细节请参考之前的博客《窥探Swift之别样的枚举类型》)。...2.在ErrorType中使用上述内置关键字 如果想在ErrorType中使用这些上下文内置关键字,我们只需要对ErrorType进行扩展,使其在ErrorType提供错误信息时给出出错的上下文信息。

    2.3K50

    Swift学习总结

    其语法与在条件语句中创建常量或变量一致,只是不需要再强制展开可空实例了,这个操作自动完成。...隐式展开可空类型与普通可空类型重要区别就是不需要展开,使用上不需要if条件语句了。如果这种隐式展开可空类型没有值的话,访问其值会直接导致运行时错误。...那么guard语句的作用到底是什么呢?顾名思义,就是守护。guard语句判断其后的表达式布尔值为false时,才会执行之后代码块里的代码,如果为true,则跳过整个guard语句。...guard语句中声明的实例可以在整个方法作用域中使用。...不过也有个例外,可以在try后面跟随感叹号。与强制展开可空实例一样,一旦出现错误程序就会崩溃。该用法谨慎使用,少用。 还有第三种情况,可以用try?

    3K20

    如何在Java和Swift中避免空引用异常?

    Java Optionals 随着在Java 1.8中引入的java.util.Optional类,显著减少了空引用的情况。尽管如此,在创建或使用 Optional 时也需要注意一些问题。...强烈建议不要使用隐式展开选项,除非是在非常特定的情况下,它们是必需的,并且您可以确定值的存在。...这可以通过使用可选绑定、nil-合并操作符或guard语句来避免。...这个常量可以有与可选项相同的名称,这将导致在块中不可见的实际可选性。除了多个展开语句外,还可以向if let语句添加布尔表达式。这些语句之间用逗号(,)分隔,它的行为类似于&&操作符。...一个保护语句只包含一个条件和/或一个未包装的语句和一个强制的else块。编译器通过使用控制传输语句(返回、抛出、中断、继续)或调用从未返回类型的方法来确保这个else块退出其封闭范围。

    2.7K30

    iOS:swift :可选类型

    号 可选类型的取值是一个枚举 * None 没有值 * Some 有值 * 由于可选类型在Swift中随处可见, 所以系统做了一个语法糖, 在类型后面加上?...是所有刚刚接触Swift的OC程序员最最蛋疼的问题, 前期开发要注意多看文档和利用编译器提示解决(option + click) 注意 * 在Swift开发中, 尽量不要使用强制解包, 不安全 */...,同时可以将可选类型中的值赋给一个常量或者变量 * 可选绑定可以用在if和while语句中 提示: * 在实际开发中,使用频率很高 注意: * 可选绑定中的变量/常量只能在if后面的{}中使用 */...* guard语句是在Swift 2.0中引进的,它是用途是在未满足某个条件时,提供一个退出的路径 * 格式: guard 表达式 else{} 注意: * guard中的变量/常量 可以在guard...后面使用 * guard一般用于避免使用强制拆包, 优化代码结构 */ func test(){ let value1: Int?

    1.2K70

    Swift3.0 - 异常错误

    OSUserLoginError.UserNameEmpty{ print("用户名为空") } catch{ print(error) } 运行结果: 用户:酷走天涯输入的密码为空 where 在错误类型的使用...defer,在对象方法中,使用defer,在defer块中,调用属性之前,必须初始化所有存储属性,重要事说三遍,所有的存储属性,所有的,存储属性 2.defer 在定义的当前作用域最后一步执行 try.../stdlib/public/core/ErrorType.swift, line 178 结论: 一旦发生异常,系统会报错,后面的代码不再继续执行 C.try?...如果发生异常则返回nil,如果没有发生异常,则返回可选值,我们在使用时,需要解包可选值!...nil,你最好的写法应该像下面这样 guard let filter = CIFilter(name: "CIGaussianBlur", withInputParameters: parameters

    61610

    封装一个 Swift-Style 的网络模块

    Swift 跟 OC 有着完全不同的设计哲学,它鼓励你使用 protocol 而不是 super class,使用 enum 和 struct 而不是 class,它支持函数式特性、范型和类型推导,让你可以轻松封装异步过程...如果你还是用 OC 的思维写着 Swift 代码,那可以说是一种极大的资源浪费,你可能还会因为 Swift 弱鸡的反射而对它感到不满,毕竟 Swift 在强类型和安全性方面下足了功夫,如果不使用 OC...在 UI 构建方面,无论是 Swift 还是 OC,无非都是调用 API 罢了,在有自动提示的情况下,其实编码体验都差不多。...Alamofire 使用 Result 来表示请求返回的结果,它是个 enum,长这样: public enum ResultErrorType> { case...,而且在测试过程中会让你发现一些开发过程中的思维盲区,还能帮你优化设计,毕竟良好的可测试性在某种程度上就意味着良好的可读性和可维护性。

    1.9K41

    Swift教程(五)--控制流

    本次的教程是基于Swift5.1版本 Swift 提供所有多样化的控制流语句。...下面罗列了swift中的控制流的一些关键字: For-in 循环 While 循环 Repeat-While If Switch Where continue break fallthrough return...使用 guard 语句来要求一个条件必须是真才能执行 guard 之后的语句。与 if 语句不同, guard 语句总是有一个 else 分句—— else 分句里的代码会在条件不为真的时候执行。...任何在条件中使用可选项绑定而赋值的变量或者常量在 guard 所在的代码块中随后的代码里都是可用的。 如果这个条件没有被满足,那么在 else 分支里的代码就会被执行。...相对于使用 if 语句来做同样的事情,为需求使用 guard 语句来提升你代码的稳定性。它会让正常地写代码而不用把它们包裹进 else 代码块,并且它允许你保留在需求之后处理危险的需求。

    71120

    Swift 周报 第三十六期

    此外,该提案旨在澄清消费任务取消和生产方表示终止时的取消行为。 Swift论坛 提议宏文字协议[4] 目前仅允许在顶层使用宏。然而,在某些情况下,嵌套宏会很有好处。...提议嵌套 if let 和 guard let[5] 介绍 在 Swift 中,if let 语句通常用于可选的解包。...目前,if let 语句解包单个可选值。然而,在某些情况下,我们希望以更简洁的方式解开嵌套对象的可选属性。 该提案建议扩展 if let 和 Guard let 语句以支持嵌套可选展开。...详细设计 这些要求可以在声明时在类型检查器中强制执行。 源兼容性 由于增加了限制,因此在使用严格的并发检查时可能需要更改某些类型声明。...它也不适用于非可发送类型,除非我们强制该值在访问它时保持隔离。

    23520

    Swift基础语法(一)

    在Swift中,语句结束可以不加分号。但是如果同一行有多个语句,仍然要加分号,不过我们不建议一行多句,我们提倡一行一句的代码风格。...在Swift中的打印语句是print var str = "Hello, playground" print(str) 在OC中,分组注释使用 #pragma mark - 但是在Swift中,分组是使用...a : b); guard的使用 guard语句与if语句非常类似,但是与if语句不同的是,guard语句当条件为false的时候才会执行{}里面的代码。...字符串 OC和Swift中的字符串是有区别的: 在OC中,字符串类型是NSString;在Swift中,字符串类型是String。 OC中定义字符串是使用@"";Swift中定义字符串是使用""。...——如果不确定向下转换类型是否能够成功,使用条件形式的类型转换操作符as? ;如果确定向下转换类型会成功时,使用强制形式的类型转换操作符as! 。

    4.3K30

    在Swift中使用error来控制流程

    抛出可空的值 可选值,作为Swift的重要特征,处理空的数据时可被合法的忽略;它也经常被用作给定函数的来源样板在控制流程中。 下面,重写了从app中bundle加载、调整图片的方法。...然而,事实是,并不是所有的地方都需要处理错误,所以不需要强制do、try、catch模式的使用;而且滥用do、try、catch又会导致我们为了尽量避免的样板代码——在用到的时候仔细区分。...既可以在调用中得到个可空值——同时也能用throw、error来管理控制流。 验证输入 接下来,我们来看一下,当验证输入时,使用error如何帮我们提升控制流。...和前面一样,代码用guard语句来判断每个验证规则,如果出错则输入错误信息: func signUpIfPossible(with credentials: Credentials) { guard...这样它就可以在隔绝中测试,也可以在我们的代码中使用。为了实现这个,先为所有验证逻辑创建一个指定类型。

    74831

    Swift专题讲解十八——异常处理 原

    Swift专题讲解十八——异常处理 一、异常的抛出与传递         代码的运行很多时候并不会完全按照程序员的设想进行,编写代码时进行可控的异常处理机制是十分必要的。...通常,对于一个特定的操作,程序员可以定义一个继承自ErrorType的枚举来进行异常类型的描述,使用throw关键字来进行异常的抛出,示例代码如下: //定义一个自定义的错误类型 enum MyError...,开发者要么在调用函数的地方捕获处理这些异常,要么使用try关键字将异常继续抛出去,等待下一层捕获者处理。...1.使用do-catch语句来捕获异常         开发者可以使用do-catch语句来捕获异常,通过异常类型的判断来分别做处理,示例代码如下: do{ try MyFunc() }catch...Swift中提供了defer语句来进行延时执行一些操作,defer中的语句总是会在当前代码块将要结束时才执行,无论它是以哪种方式结束的,示例如下: //执行此函数将打印 /* Care finish

    35720

    Hi Swifter:来和Guard问声好吧

    Swift正逐步占领iOS App实际开发的市场份额,Swift 的简洁、易用性已经吸引了大量开发者,大家已开始或准备开始使用Swift开发iOS App。...正如上面语法格式中所看到的,在 guard 语句的else 块中必须有return、break、continue或throw 语句来跳出guard 语句所在的代码块,当然也可以调用如fatalError...guard 语句也可以出现在函数或闭包中,此时guard 语句的else 块可以使用return 等语句跳出guard 所在的代码块;guard 语句还可以出现在分支、循环的代码块内,此时guard 语句的...正如上面代码中所看到的,guard 语句位于for 循环内,guard 语句用于判断i 是否小于5,当i 不小于5 时,程序执行guard 语句的else 块,else 块中的break 语句即可跳出for...上面程序中 guard 语句出现在test()函数中,guard 语句的作用是保证程序调用test()函数时传入的参数不为nil。

    57010

    Swift封装-滑出式导航栏

    optional func toggleLeftPanel() //切换左边的容器 @objc optional func collapseSidePanels() //折叠侧边的容器 } 在DWCenterViewController.swift...func didSelectAnimal(_ animal: DWStar) //选择的动物 } 在DWCenterViewController.swift实现DWSidePanelViewControllerDelegate...) 实现协议方法(添加左侧容器一起动画的发生代码): extension DWContainerViewController: DWCenterViewControllerDelegate { } 在协议方法中...语句判断其后的表达式布尔值为false时,才会执行之后代码块里的代码,如果为true,则跳过整个guard语句 guard leftViewController == nil else { return...如果它应该展开,那么它将设置当前状态以指示左侧面板展开,然后为中央面板设置动画,以便打开。否则,它将关闭中央面板,然后移除其视图,并设置当前状态以指示其关闭。

    2.3K80

    Swift开发规范-修订版

    } 【强制】访问实例成员或方法时不要使用 self....【推荐】在代码中灵活的使用一些地标注释,如MARK、FIXME、TODO,当同一文件中存在多种类型定义或者多种逻辑时,可以使用Mark进行分组注释,方便通过Xcode顶部面包屑进行切换; 代码示例: /...【强制】避免强制解包以及强制类型映射,尽量使用if let 或 guard let进行解包,禁止try!...形式处理异常,避免使用隐式解包; 【强制】避免判断语句嵌套层次太深,使用 guard 提前返回; 【推荐】如果 for 循环在函数体中只有一个 if 判断,使用 for where 进行替换; 【推荐】...实现每个协议时,尽量在单独的 extension 里来实现; 【推荐】优先创建函数而不是自定义操作符; 【推荐】尽可能少的使用全局命名空间,如常量、变量、方法等; 【推荐】赋值数组、字典时每个元素分别占用一行时

    1.7K50

    SwiftUI 与 Core Data —— 安全地响应数据

    Core Data 受限于 Objective-C 中可表达的类型限制,在即使使用了标量转换的情况下( Scalar )也不具备与 Swift 原生类型对应的能力。...可能开发者会有这样的疑问,假如某个实体的属性在模型中被定义为可选,且在托管对象的类型声明中也为可选值类型( 例如上方的 timestamp 属性 ),那么如果在可以保证 save 时一定有值的情况下,是否可以在使用中使用...号对其进行强制解包?事实上,在 Xcode 自带的 Core Data 模版中,就是这样使用的。image-20221212101526366但这确实是正确的使用方式吗?是否会有严重的安全隐患?...从另一个角度来看,即使在托管上下文中使用 delete 方法删除该实例在数据库中对应的数据,但如果该托管对象实例仍被代码或视图所引用,Swift 并不会销毁该实例,此时,托管对象上下文会将该实例的 managedObjectContext...在删除数据后,即使 item 的内容发生了变化,也并不会引发该行声明语句( Text )刷新,从而不会出现强制解包失败的情况。

    3.3K20

    使用 Swift 提高代码质量

    类型安全 强制类型转换 - 禁止隐式类型转换避免转换中带来的异常问题。同时类型转换不会带来额外的运行时消耗。。 提示:编写ObjC代码时,我们通常会在编码时添加类型检查避免运行时崩溃导致Crash。...使用枚举/常量代替硬编码 代码中存在重复的硬编码字符串/数字,在修改时可能会因为不同步引发bug。尽可能减少硬编码字符串/数字,使用枚举或常量代替。...if b { a = 1 } else { a = 2 } 使用for where优化循环 for循环添加where语句,只有当where条件满足时才会进入循环 不推荐 for item...isKnownUniquelyReferenced实现写时复制 默认情况下结构体中包含引用类型,在修改时只会重新拷贝引用。...优化逃逸闭包 在Swift中,当捕获var变量时编译器需要生成一个在堆上的Box保存变量用于之后对于变量的读/写,同时需要额外的内存管理操作。

    4.7K30
    领券