本篇分两部分:

一、extension在 Swift 中的使用

二、Swift 中的 fatalError


一、extension在 Swift 中的使用

  在 swift 中我们可以通过 extension 来输出做格式化等操作

通常情况下,当我们在开发过程中需要打印某些对象中的信息时,我们会编写如下代码:

struct Meeting {
var date: NSDate
var place: String
var attendeeName: String
}
let meeting = Meeting(date: NSDate(timeIntervalSinceNow: ),
place: "会议室B",
attendeeName: "小明")
print(meeting)

print("与 \(meeting.date) 在 \(meeting.place) 与 \(meeting.attendeeName) 进行会议")

输出结果: 

  这种开发方式在 Swift 中可以算得上是非常传统的代码了,如果我们需要输出其他对象的一些信息时,会不断手动实现上面的代码,如果过于频繁会大大降低开发效率,所以,这里我们可以利用 extension 特性来进行优化。

extension Meeting: CustomStringConvertible {
var description: String {
return "与 \(meeting.date) 在 \(meeting.place) 与 \(meeting.attendeeName) 进行会议"
}
}
print(meeting)

输出结果: 


二、Swift 中的 fatalError

let array: NSArray = [,,]

上面的数组长度为3,如果我们在开发过程中由于某些原因,在使用上面的数组时写成了 array[100] 就会报数组越界错误,程序崩溃。

  在 OC 中数组越界输出的错误信息为:*** Terminating app due to uncaught exception 'NSRangeException',reason: '*** -[__NSArrayI objectAtIndex:]:index 100 beyond bounds [0 .. 2]'

  在 Swift 中为 fatal error: Array index out of range

  在调试时我们可以用断言来排除类似这样的问题,但是断言只会在 Debug 环境中有效,而在 Release 编译中所以变得断言都将被禁用。所以我们会考虑以产生致命错误(fatalError)的方式来种植程序。

enum MyEnum {
case Value1,Value2,Value3
} func check(someValue: MyEnum) -> String {
switch someValue {
case .Value1:
return "OK"
case .Value2:
return "Maybe OK"
default:
// 这个分支没有返回 String,也能编译通过
fatalError("Should not show!")
// return "Should not show!"
}
}
let a = check(.Value3)

这时如果我们传入的参数不属于指定范围,这里就会报错

  当我们在开发过程中,遇到不想让别人调用而又不得不将其暴漏出来的方法时,一个最常见并且合理的需求就是”抽象类型或者抽象函数“。在很多语言中都有这样的特性:父类定义了某个方法,但是自己并不给出具体实现,而是要求继承他的子类去实现这个方法,而在 OC 和 Swift 中都没有直接的这样的抽象函数语法支持。在面对这种情况时,为了确保子类实现这些方法,而父类中的方法不被错误的调用,我们就可以利用 fatalError 来在父类中强制抛出错误,以保证使用这些代码的开发者留意到他们必须在自己的子类中实现相关方法。

class MyClass {
func methodMustBeImplementedInSubclass() {
fatalError("这个方法必须在子类中被重写") }
}
class YourClass: MyClass {
override func methodMustBeImplementedInSubclass() {
print("YourClass 实现了该方法") }
}
class TheirClass: MyClass {
func someOtherMethod() {
}
// override func methodMustBeImplementedInSubclass() {
// print("TheirClass 实现了该方法")
// }
} YourClass().methodMustBeImplementedInSubclass()

TheirClass().methodMustBeImplementedInSubclass()

这个方法必须在子类中被重写,否则会编译报错

  不仅仅是对于类似抽象函数的使用中可以选择 fatalError,对于其他一切我们不希望别人随意调用,但是又不得不去实现的方法,我们都应该使用 fatalError 来避免任何可能的误会。比如父类标明了某个 init 方法是 required 的,但是你的子类永远不会使用这个方法来初始化时,就可以采用类似的方法,被广泛使用(以及被广泛讨厌的)init(coder: NSCoder)就是一个例子。在子类中我们往往会写:

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

来避免编译错误。

Swift开发第二篇——extension及fatalError的更多相关文章

  1. swift开发多线程篇 - 多线程基础

    swift开发多线程篇 - 多线程基础 iOS 的三种多线程技术 (1)NSThread  使用NSThread对象建立一个线程非常方便 但是!要使用NSThread管理多个线程非常困难,不推荐使用 ...

  2. iOS开发——高级技术精选&底层开发之越狱开发第二篇

    底层开发之越狱开发第二篇 今天项目中要用到检查iPhone是否越狱的方法. Umeng统计的Mobclick.h里面已经包含了越狱检测的代码,可以直接使用 /*方法名: * isJailbroken ...

  3. android 串口开发第二篇:利用jni实现android和串口通信

    一:串口通信简介 由于串口开发涉及到jni,所以开发环境需要支持ndk开发,如果未配置ndk配置的朋友,或者对jni不熟悉的朋友,请查看上一篇文章,android 串口开发第一篇:搭建ndk开发环境以 ...

  4. swift开发网络篇—NSURLConnection基本使用

    iOS开发网络篇—NSURLConnection基本使用 一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据 ...

  5. 微信支付之JSAPI开发-第二篇:业务流程详解与方案设计

    微信支付流程 流程: 上图的网址为:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_4 如上图所示,微信网页支付的具体流程大致分为 ...

  6. Swift开发第一篇——异常处理及断言

    本篇分两部分: 1.错误和异常处理 2.Swift 中的断言 1.错误和异常处理 在 OC 开发中,我们通常会将 error 置为 nil NSError *error; BOOL success = ...

  7. Swift开发第九篇——Any和AnyObject&typealias和泛型接口

    本篇分为两部分: 一.Swift中的Any和AnyObject 二.Swift中的typealias和泛型接口 一.Swift中的Any和AnyObject 在 Swift 中,AnyObject 可 ...

  8. SAP web 开发 (第二篇 bsp 开发 mvc模式 Part2 )

    单击第一个图标,第一个图标突出显示,单击第二个图标,第一个变灰,第二个突出显示,反之一样.单击history读取历史记录. Controller ZCL_SUS_C_ORDER_CHANGE 1.   ...

  9. PowerBI开发 第二篇:数据建模

    在分析数据时,不可能总是对单个数据表进行分析,有时需要把多个数据表导入到PowerBI中,通过多个表中的数据及其关系来执行一些复杂的数据分析任务,因此,为准确计算分析的结果,需要在数据建模中,创建数据 ...

随机推荐

  1. Android 获取可靠的手机编码

    项目中出现了将设备和用户信息进行绑定的需求.最先想到的是IMEI串码和IMSI串码.手机登陆的时候一直都没有问题.换了一个平板中之后IMEI和IMSI串码都获取不到了.后来查了一下原因,是因为平板上是 ...

  2. 【转】NoSQL初探之人人都爱Redis:(1)Redis简介与简单安装

    一.NoSQL的风生水起 1.1 后Web2.0时代的发展要求 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类型的Web2.0纯动态网站已经 ...

  3. 【转载】ASP.NET MVC Web API 学习笔记---第一个Web API程序

    1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...

  4. 使用KeleyiSQLHelper类进行分页查询

    本文适用于sql server单主键表或者视图进行分页查询,支持多字段排序. KeleyiSQLHelper类的最新代码请到http://hovertree.com/down/下载整个解决方案源代码查 ...

  5. 对TabControl的简单优化

    之前由于忙于赶项目进度而忽视了软件的用户体验,界面挺难看,有一天看见组长优化了某个窗体,让人感觉完全不一样,我也不甘示弱,要把我的程序做顺眼一点才行.我的程序是一个以TabControl为主要容器的窗 ...

  6. C#-INotifyPropertyChanged(解决数据绑定的界面刷新问题)

    最近做项目用到DataGridView,用它绑定数据源后,如果数据源中的数据修改无法及时刷新到控件上,必须切换单元格的焦点才能导致刷新显示新数值,通过查官方文档,用INotifyPropertyCha ...

  7. 项目中的web api知识总结

    最近在做公司的项目,自己负责webapi的框架的搭建与开发,最近很忙,一直没时间对工作中遇到的知识点缺少个总结,现总结一下,对自己是个提升,如果个人的小点点小总结能对博友有帮助那也是善莫大焉. (1) ...

  8. MySQL的安装与配置

    首先,到http://www.mysql.com/downloads/下载MySQL的安装文件mysql-installer,双击运行安装. 然后,配置环境变量,右键单击:我的电脑->高级-&g ...

  9. 非阻塞同步算法与CAS(Compare and Swap)无锁算法

    锁(lock)的代价 锁是用来做并发最简单的方式,当然其代价也是最高的.内核态的锁的时候需要操作系统进行一次上下文切换,加锁.释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放. ...

  10. Java并发编程:Timer和TimerTask(转载)

    Java并发编程:Timer和TimerTask(转载) 下面内容转载自: http://blog.csdn.net/xieyuooo/article/details/8607220 其实就Timer ...