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 ErrorOnecase ErrorTwocase ErrorThreecase 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针对的不是函数或者方法的本身,而是它携带的闭包类型的参数。当它的闭包类型的参数throws的时候,我们要使用rethrows
继续将这个异常往上传递, 直到被调用者使用到。
func willRethrow(_ throwCall: (Int) throws -> String) rethrows
作用:使用rethrows继续将这个异常往上传递, 直到被调用者使用到。
代码如下:
//错误类型枚举
enum MyError : Error {case ErrorOnecase ErrorTwocase ErrorThreecase ErrorOther
}func willThrow(_ type:Int)throws -> String{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 "一切都很好"
}
func willRethrow(_ throwCall: (Int) throws -> String) rethrows {do {let result = try throwCall(2)print(result)} catch let err as MyError {throw err //这里进行了 再次throw} catch {}
}//MARK:调用
let afunc = willThrow
do {try willRethrow(afunc)
} catch let err as MyError {print("rethrows ",err)
} catch {}
/*打印:开始处理错误rethrows ErrorTwo */
代码中看到,willRethrow
本身并不对错误进行处理,原因是它本身并不会差生错误。另外的,它的参数throwCall
进行了错误的处理,willRethrow
对throwCall
的错误进行再次throw
。
简单来说,rethorws
就是throws
的传递,也即是对于throw的一个层次级别的应用。我们甚至可以进行多级传递,但是会导致代码过于复杂,不建议这么做。
try
: “踹”,程序员手动捕捉异常
// try方式
do {try String.init(contentsOfFile: htmlPate!, encoding: String.Encoding.utf8)
} catch {//抛出异常print(error)
}
try?
方式: “疑问踹”, 系统帮助我们处理异常 。如果该方法出现了异常,则方法返回nil 。如果没有异常,则返回相应的对象。
//安全校验
guard let htmlCont = try? String.init(contentsOfFile: htmlPate!, encoding: String.Encoding.utf8) else {return
}
try!
方式: “强踹”,直接告诉系统,该方法没有异常。如果该方法出现了异常,直接崩溃。
let htmlCont = try! String.init(contentsOfFile: htmlPate!, encoding: String.Encoding.utf8)
来自:
1.Swift中一些常见的关键字一(inout,defer,throw等)
2.Swift学习记录 – Swift中throws处理方式
3.Self的使用场景,associatetype的作用
来自:swift 中 Self 与self
在定义协议的时候,Self
使用的频率很高,比如rx。Self
不仅指代的是 实现该协议的类型本身,也包括了这个类型的子类。
示例1:
protocol MProtocolTest01 {// 协议定一个方法,接受实现该协议的自身类型并返回一个同样的类型func testMethod(c: Self) -> Self//不能在协议中定义 范型 进行限制//Self 不仅指代的是 实现该协议的类型本身,也包括了这个类型的子类
}
示例2:模拟copy 方法
protocol Copyable {func copy() -> Self
}class MMyClass: Copyable {var num = 1func copy() -> Self {let result = type(of: self).init()result.num = numreturn result}//必须实现//如果不实现:Constructing an object of class type 'Self' with a metatype value must use a 'required' initializer。错误required init() {}
}
associatedtype
:**关联类型为协议中的某个类型提供了一个占位名(或者说别名),其代表的实际类型在协议被采纳时才会被指定。你可以通过 associatedtype
关键字来指定关联类型。**比如使用协议声明更新cell的方法:
//模型
struct Model {let age: Int
}//协议,使用关联类型
protocol TableViewCell {associatedtype Tfunc updateCell(_ data: T)
}//遵守TableViewCell,需要实现 `typealias T = ...` 和 `updateCell`方法
class MyTableViewCell: UITableViewCell, TableViewCell {typealias T = Modelfunc updateCell(_ data: Model) {// do something ...}}
4.map、filter、reduce的作用,map与flatmap的区别
来自:1.Swift中 Map,Flatmap,Filter,Reduce的用法
2.Swift:Map,FlatMap,Filter,Reduce指南
map
:map方法作用是把数组[T],通过闭包函数把每一个数组中的元素变成U类型的值,最后组成数组[U]。定义如下:func map(transform: (T) -> U) -> [U]
@inlinable public func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]
filter
就是筛选的功能,参数是一个用来判断是否筛除的筛选闭包。根据闭包函数返回的Bool值来过滤值,为True则加入到结果数组中。定义如下:
func filter(includeElement: (T) -> Bool) -> [T]
@inlinable public func filter<T>(_ isIncluded: (Element) throws -> Bool) rethrows -> [T]
reduce
的作用给定一个类型为U的初始值,把数组[T]中每一个元素传入到combine的闭包函数里面,通过计算得到最终类型为U的结果值。定义如下:
func reduce(initial: U, combine: (U, T) -> U) -> U
@inlinable public func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Self.Element) throws -> Result) rethrows -> Result
map与flatmap的区别:
本质上,相比 map
,flatMap
在可选值层做了一个解包。
var value: String? = "1"
var result = value.map{ Int($0)}
print(result)
///打印:
///Optional(Optional(1))
var value: String? = "1"
var result = value.flatMap{ Int($0)}
print(result)
///打印:
///Optional(1)
使用flatMap就可以在链式调用时,不用做额外的解包工作:
var value: String? = "1"
var result = value.flatMap{ Int($0)}.map { $0 * 2 }
print(result)
///打印:
///Optional(2)
flatMap
对SequenceType的两个作用:
一:压平
var values = [[1,3,5,7],[9]]
let flattenResults = values.flatMap{ $0 }
print(flattenResults)
///打印:
///[1, 3, 5, 7, 9]
二:空值过滤
var values: [Int?] = [1,3,5,7,9,nil,10]
let flattenResults = values.flatMap{ $0 }
print(flattenResults)
///打印:
///[1, 3, 5, 7, 9, 10]
5.GCD与NSOperationQueue有哪些异同
来自:iOS面试题01-多线程网络(★★★)
GCD是纯C语言的API,
NSOperationQueue
是基于GCD的OC版本封装GCD只支持FIFO的队列,
NSOperationQueue
可以很方便地调整执行顺序、设置最大并发数量NSOperationQueue
可以轻松在Operation间设置依赖关系,而GCD需要写很多的代码才能实现NSOperationQueue
支持KVO,可以监测operation是否正在执行(isExecuted)、是否结束(isFinished),是否取消(isCanceld)GCD的执行速度比
NSOperationQueue
快任务之间不互相依赖:使用GCD
任务之间有依赖,或者要监听任务的执行情况:使用
NSOperationQueue
6.图解MVC,MVVM架构
来自:iOS 架构模式–解密 MVC,MVP,MVVM以及VIPER架构
传统的MVC模式:
“传统的MVC架构不适用于当下的iOS开发”
**苹果推荐的MVC–**愿景
**苹果推荐的MVC–**事实
“就开发速度而言,Cocoa MVC是最好的架构选择方案。”
MVP 实现了Cocoa的MVC的愿景
MVVM–最新且是最伟大的MV(X)系列的一员
“MVVM很诱人,因为它集合了上述方法的优点,并且由于在View层的绑定,它并不需要其他附加的代码来更新View,尽管这样,可测试性依然很强。”
VIPER–把LEGO建筑经验迁移到iOS app的设计
7.如何提升tableview的流畅度
8.图解一下TCP发起连接和断开连接的过程。
来自:
1.iOS面试题01-多线程网络(★★★)
2.IOS-基于CocoaAsyncSocket的服务端的监听(二)
Socket通信流程:
十二、什么是 TCP连接的三次握手
第一次握手:客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SEND 状态,等待服务器确认;
第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP 连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开 TCP 连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客户端交互,最终确定断开)
AKULAKU笔试题(还有1题未答)相关推荐
- python少儿编程讲师笔试题_小码王教育儿童编程教师面试:做笔试题(填空题和编程题,填空题 - 职朋职业圈...
为了帮助职业圈网友能够及时了解小码王教育的面试流程以及面试过程所涉及的面试问题,职业圈小编把刚获得的小码王教育面试经验马上编辑好,快速提供给大家,以便能够尽快帮助到有需要的人.这次面试总共花了1天.面 ...
- 90 个名企笔试题和算法题
名企笔试 名企笔试:美团2016招聘笔试(股票交易日) 名企笔试:搜狐2016招聘笔试题(扎金花) 名企笔试:凤凰网2015招聘(二分查找) 名企笔试:4399游戏校招笔试题(快速排序) 名企笔试:蘑 ...
- 搬:90 个名企笔试题和算法题
名企笔试 名企笔试:美团2016招聘笔试(股票交易日) 名企笔试:搜狐2016招聘笔试题(扎金花) 名企笔试:凤凰网2015招聘(二分查找) 名企笔试:4399游戏校招笔试题(快速排序) 名企笔试:蘑 ...
- 2019面试/笔试题(算法题)总结
实战链接:https://www.acwing.com/activity/content/8/ Google KickStart 2019 A轮 1. 训练 题目描述 作为一名学校足球教练,你的任务是 ...
- C/C++笔试题(基础题)
为了便于温故而知新,特于此整理 C/C++ 方面相关面试题.分享,共勉. (备注:各题的重要程度与先后顺序无关.不断更新中......欢迎补充) (1)分析下面程序的输出(* 与 -- 运算符优先级问 ...
- Linux运维必会的实战编程笔试题(19题)
以下Linux运维笔试面试编程题,汇总整理自老男孩.马哥等培训机构,由运维派根据实战需求,略有调整: 企业面试题1:(生产实战案例):监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理 ...
- 2020.4.15华为实习招聘笔试题第三题
很可惜,当时没做出来,写了个bug调了一个多小时,但是思路是对的. leetcode刷久了,对各种输入的处理能力不够,第一题本来很简单,也是写了一个bug把心态搞炸了.后续几乎没什么面试机会了.4月末 ...
- 2018校招笔试题——网易编程题跳石板
题目与要求如下所示: [编程题] 跳石板 时间限制:1秒 空间限制:32768K 小易来到了一条石板路前,每块石板上从1挨着编号为:1.2.3....... 这条石板路要根据特殊的规则才能前进:对于小 ...
- 贝壳找房 9月7日 笔试题 第四题-查族谱
贝壳找房第四题代码,时间复杂度o(nlogn) 题目: 样例: 代码: n = 4 # 结点数 pairs = [[1,2],[3,4],[3,1]] # 边 child = [-1,2,0,1,0] ...
- 【美团点评2020校招测试方向笔试题】算法题部分1.删除字符 2.队列组合排序 3.寻找最小子字符串 4.最大矩形 5.最短送餐路程计算
做题网址:点击进入 1.[编程题]删除字符 将给定的字符串,按照规则删除字符,输出删除后的字符串.删除规则为:相同字符连续,则删除,如"aaaab"删除后的字符串为"b& ...
最新文章
- 无盘服务器 双镜像盘,镜像(无盘柜)-双活集群解决方案
- centos 对某ip开放 防火墙端口_CentOS7 firewalld防火墙指定IP与端口访问
- 【转】vscode下编译告警“undefined reference”?三步教你如何解决
- VMware专家:行动起来 狙击云炒作
- x86-64函数调用参数传递
- android上实现0.5px线条
- Java随机生成红色_Java生成图片红色问题
- tcp 三次握手连接
- slickedit背景颜色和当前关键字高亮
- android中如何去掉键盘,总结:Android去掉软键盘(输入法)的方法
- 修改联通服务器,联通光猫dns设置服务器地址
- 成功举办!805个团队参赛~
- 2022-2028年全球及中国光纤布拉格光栅(FBG)加速度计行业投资前景分析
- NB-loT中的Niubility技术
- php怎么改北京时间,php如何设置北京时间
- 恒源云(GPUSHARE)_CV训练时容易忽视的数据标签问题
- 信息学奥赛一本通(题解目录)
- 程序员的半衰期只有15年
- 北京一卡通显示未能连接到服务器,教你苹果手机如何绑北京一卡通
- 关于程序员背景做公众号的想法
热门文章
- 没错,中国程序员前景一片黑暗
- HDU 5857 Median (推导)
- Python中in的用法小结
- chrome清楚缓存并硬性重新加载
- /usr/bin/ssh-copy-id: ERROR: ssh: Could not resolve hostname 192.168.0.114:root/.ssh/authorized_keys
- C语言 汉字名字排列组合
- 路由汇总与路由聚合的区别
- 使用python语解决一个小学数学题----鸡兔同笼问题
- 关于游戏中美术文件夹的划分
- 选择图片未经后端显示预览图片