1.public和open的区别
答:
来自:private、fileprivate、internal、public和open的区别
在Swift语言中,访问修饰符有五种,分别为fileprivate,private,internal,public和open,其中 fileprivate和open是Swift 3新添加的。由于过去 Swift对于访问权限的控制是基于文件的,不是基于类的。这样会有问题,所以Swift 3新增了两个修饰符对原来的private、public进行细分。
private
private所修饰的属性或方法只能在当前类里访问
private所修饰的类只能在当前.swift文件里访问
fileprivate
fileprivate访问级别:所修饰的属性或方法,可在当前的Swift源文件里可以访问。
internal(默认访问级别,internal修饰符可写可不写)
internal访问级别所修饰的属性或方法,在源代码所在的整个模块都可以访问、被继承、被重写。
**如果是框架或者库代码,则在整个框架内部都可以访问。框架被外部代码使用时,则不可以访问。**即使使用import,也会提示错误:
No such module ‘…’
如果是App代码,也是在整个App代码,也是在整个App内部可以访问。
public
可以被任何类访问。但其他module中不可以被override和继承,而在module内可以被override和继承。
Cannot inherit from non-open class ‘…’ outside of its defining module
open
可以被任何类使用,包括override和继承。
访问权限排序从高到低排序:open>public>interal > fileprivate >private
总结
属性和方法的访问控制通俗的分级顺序应该是:
当前类(private)、当前swift文件(fileprivate)、 当前模块(internal)、其它模块(open、public)
属性和方法的修饰:在当前模块internal、open、public是同一级别,在外模块open、public是同一级别
类的访问级别:
当前类(private)、当前swift文件(fileprivate)、 当前模块(internal)、其它模块(open需要import)、是否可被继承被重写(public需要import)
可以发现cocopod导入的第三方库,作为外模块一般都是使用的open、public修饰类,来提供给项目使用
2.throws和rethrows的用法与作用,try?和try!是什么意思
一、throws
throws的使用很简单,只需要在可能出现异常的函数或者方法后面添加throws。经过这个关键字修饰的函数,在调用的时候,需要程序员加上do-catch来调用。
对于错误类型开发者来说,只需要使用Throws进行修饰,就保证了以后的调用者必然需要对相应的错误进行处理(当然也可以不处理,但无论如何,错误被throw携带出来了,以后的维护和优化不需要重新做错误处理的设计,直接加上错误处理的逻辑即可)。
用法:在可能出现异常的函数或者方法后面添加throws。经过这个关键字修饰的函数,需要程序员加上do-catch
来调用。
作用:错误被throws携带出来了,以后的维护和优化不需要重新做错误处理的设计,直接加上错误处理的逻辑即可。保证以后的调用者必需对相应的错误进行处理。
代码如下:
//错误类型枚举
enum MyError : Error {
case ErrorOne
case ErrorTwo
case ErrorThree
case ErrorOther
}
func willThrow(_ type:NSInteger)throws -> NSString{
print("开始处理错误")
if type == 1 {
throw MyError.ErrorOne
}else if type == 2 {
throw MyError.ErrorTwo
}else if type == 3{
throw MyError.ErrorThree
}else if type == 4{
throw MyError.ErrorOther
}
return "一切都很好"
}
//调用
do {
let str = try willThrow(2)
//以下是非错误时的代码
print(str) //如果有错误出现,这里将不会执行
}catch let err as MyError{
print(err)
}catch{
//这里必须要携带一个空的catch 不然会报错。 原因是可能遗漏
}
/*打印:
开始处理错误
ErrorTwo */
二、rethrows
rethrows是异常往上传递的关键字。rethrows针对的不是函数或者方法的本身,而是它携带的闭包类型的参数。当它的闭包类型的参数throws的时候,我们要使用rethrows继续将这个异常往上传递, 直到被调用者使用到。这相比throws多一个传递的环节。
用法:rethrows
是异常往上传递的关键字。rethrows针对的不是函数或者方法的本身,而是它携带的闭包类型的参数。当