mutating的作用
struct 是值类型,默认情况下实例方法不能修改值类型的属性 需加 mutating
1.1 Swift 不建议在struct,enum的普通方法里修改属性值,但是加了mutating 关键字之后就可以了 如下
struct Point {
var x = 0
var y = 0
mutating func movePoint(x:Int,y:Int) {
self.x = 1
}
}
1 class 和 struct 的区别
class 是类,引用类型,可以继承
Struct 是结构体,值类型,不可继承
2 不通过继承,代码复用,共享的方式
扩展,全局函数,继承应该也可以
3 Set独有的方法:
求 交集,并集,合集,对称差集(各自有的),元素没有顺序,同样的元素只能有一个。
4 实现一个min 函数,返回两个元素较小的元素
func min<T:Comparable>(a : T,a : T) -> T {
return a > b ? a : b
}
5 map filter reduce 的区别
map: 对数组中的每个元素进行处理,返回同长数组。(映射)
filter: 返回符合条件的元素组成的数组。(过滤)
reduce: 数字的话返回和。(合并)
6 map 和 filtmap的区别
map 返回可选值
filtmap 返回解析后的,去掉返回值为空的元素。
7 什么是copy on write
写时复制,即 swift 中发生赋值行为时, 不会重新开辟内存,只有在被赋值元素发生改变时才复制。
8如何获取当前代码的函数和行号
print("函数名:\(#function)")
print("行号:\(#line)")
9如何声明一个只能被类conform 的protocol(x)
声明协议的时候加一个class
protocol SomeClassProtocl: class {
func someFunction()
}
10 guard 使用场景
guard password == confirmPassword else {
print("两次输入密码不一致")
return
}
11 defer 使用场景
清理工作,回收资源,如关闭文件
12 String 和 NSString 的关系与区别?
String: 结构体 值类型
NSString : 类,引用类型
13 怎么获取一个字符串的长度
.count
.lengthOfBytes(using:ascii)
14 如何截取字符串的某段字符串。
对String 做了个扩展 ,计算index 很反人类,扩展成类似之前的substring
?15 throw 和rethrows的用法与作用
throws 用在函数上,表示这个函数会抛出错误,
rethrows只适用于参数中有函数,且会抛异常的情况。
16 try? 和 try!
函数抛出异常时使用
用 try? 抛出异常不会崩溃, 会返回 nil
用 try! 会崩溃
17 associatedtype的作用?
简单讲就是protocol 使用的泛型,如下:
protocol ListProtcol {
associatedtype Element
//或者指定
typealias Element = Int
func push(_ element:Element)
func pop(_ element:Element) -> Element?
}
18 什么时候使用final
不希望继承的子类重写方法时。限制继承后的重写
19 public 和 open
Open 嘛 比public 范围更大一些, 模块外也可以继承。
20 声明一个没有返回值的闭包
typealias SomeCloseTypes4 = (Int,Int) -> (Int)
let someCloseTypes4 : SomeCloseTypes4 = {(a:Int,b:Int) in
return a + b
}
21 Self 的使用场景
通常在一个协议中使用,用来表示实现者或者实现者的子类类型。
如定义个复制的协议
protocol CopyProtocal {
func copy() -> Self
}
如果是结构体实现,需要将Self 换成具体的类型。
struct SomeStruct: CopyProtocol {
let value: Int
func copySelf() -> SomeStruct {
return SomeStruct(value: self.value)
}
}
23 dynamic
Swift 是一个静态语言,所以没有oc的消息发送这些机制,dynamic 的作用就是让Swift 有oc的动态机制,常用的地方如KVO。如需要监控一个属性,则必须标记为dynamic。 try
24 什么时候使用@objc
需要调用oc方法的时候,如btn的selector,的方法需要
因为selector 是oc runtime的方法, 默认是不可见的,需要@objc 修饰暴露出来。
25 可选型是用什么实现的?
enum Optional<Wrapped> {
case none
case some(Wrapped)
}
26 自定义下标获取
public subscript(index: Int) -> Element
27 ?? 的作用
var name = ”11“
print(name ? "名字为空") 当字符串为空的时候,输出 ?? 后面的
28 lazy 作用
懒加载 需要的时候再去调用, 节省某段时间。
30 inout 作用 传递指针 输入输出参数
31 Error 兼容NSError 直接转换 as 会丢失数据
32下面的代码用了哪些语法糖? [1 ,2 ,3].map{$0 * 2}
1 快速创建数组
2 第一个参数用 $0 代替
3 闭包类型的自动推断 闭包没有声明函数参数,返回值类型等。
4 闭包中语句只有一句,自动将这一句的结果作为返回值。
33 什么是高阶函数?
一个函数,如果可以以函数作为参数或者返回值
34 如何解决循环引用
使用弱引用
转化成值类型
35 代码是否会崩溃?
var mutableArray = [1,2,3]
for _ in mutableArray {
mutableArray.removeLast()
}
不会
for in 循环内部是一个Iterator的实现,array.makeIterator()返回了一个迭代器。所有for in 迭代的是一个迭代器,和原数组没有关系了,所以不会崩溃
36 给集合中元素是字符串的类型添加一个扩展方法,应该怎么声明?
extension Array where Element == String {
var isStringElement:Bool {
retrun true
}
}
37 定义静态方法时,关键字static 和 class有什么区别?
static 定义的方法不可以被子类继承,class 则可以
?38 一个Sequence 的索引是不是一定从0 开始?
不一定,不保证都从0 开始。
39 数组实现了那些协议?
mutableCollection 实现了可修改的数组
expressibleByArrayLiteral 实现了字面值初始化的能力
41 autoclosure 的作用
自动将一个表达式封装成闭包。
42 编译选项 whole modle optmization优化了什么?
编译器对代码的分析不在局限于一个文件,而是从整个模块。对代码了解的全面,编译的更好。
43 dynamic frameword 和 static framework 的区别
静态库和动态库
静态库是每个程序单独打包一份
动态库则是多个程序之间共享。
44 willSet didSet 的使用, 例如变量的值发生改变做出一些响应:
struct People {
var name = ""
var age = 0
var sex = ""
}
var jack = People() {
willSet {
print("准备赋值")
print(jack.name)//此时打印还没有值
}
didSet {
print("赋值成功")
print(jack.name)
//调用方法
myFunction()
}
}
let nick = People(name: "网络请求数据", age: 19, sex: "男")
jack = nick
45 lazy: 只对想要的元素进行map 和 filter 操作?
let items = (1...4000).lazy.map { $0 * 2 }.filter { return $0 < 10 }
print(items.first) // Optional(2)
for temp in items {
print(temp)
}