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)
        }