AKULAKU笔试题(还有1题未答)

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针对的不是函数或者方法的本身,而是它携带的闭包类型的参数。当

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值