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

AKULAKU笔试题(还有1题未答)这篇博客详细探讨了 Swift 中的访问控制 包括 public open fileprivate internal 和 private 的区别 以及它们在不同场景下的应用

1.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多一个传递的环

今天的文章 AKULAKU笔试题(还有1题未答)分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2024-12-12 11:51
下一篇 2024-12-12 11:46

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/84489.html