swift快速入门:https://www.yiibai.com/swift/swift_quick_guide.html
JSON校验格式化工具:https://www.bejson.com/
oc转Swift:https://swiftify.com/converter/code/
1.Swift和Objective-C有什么区别
(1)Swift是静态语言,有类型推断;Objective-C是动态语言
(2)Swift支持多编程范式,既支持面向对象编程,也支持面向协议编程,同时还支持函数式编程;Objective-C面向对象编程
(3)Swift注重值类型;Objective-C注重引用类型
(4)Swift支持泛型;Objective-C只支持轻量泛型(给集合添加泛型)
(5)Swift支持静态派发(效率高)、动态派发(函数表派发、消息派发)方式;Objective-C支持动态派发(消息派发)方式
(6)Swift支持函数式编程(高阶函数)
(7)Swift的协议不仅可以被类实现,也可以被Struct和Enum实现
(8)Swift有元组类型、支持运算符重载
(9)Swift支持命名空间
(10)Swift支持默认参数,即:
(11)Swift比Objective-C代码更简洁
总结Swift比Objective-C的优势:
Swift容易阅读,语法和文件结构简易化;
Swift更易于维护,文件分离后结构更清晰;
Swift更加安全,它是类型安全的语言;
Swift的代码更少,简洁的语法可以省去大量代码;
Swift速度更快,运算性能更高。
2.讲讲Swift的派发机制
函数的派发机制:静态派发(直接派发)、函数表派发、消息派发。
Swift派发机制总结:
(1)Swift中所有ValueType(值类型:Struct、Enum)使用直接派发;
(2)Swift中协议的Extensions使用直接派发,初始声明函数使用函数表派发;
(3)Swift中Class中Extensions使用直接派发,初始声明函数使用函数表派发,dynamic修饰的函数使用消息派发;
(4)Swift中NSObject的子类用@nonobjc或final修饰的函数使用直接派发,初始声明函数使用函数表派发,dynamic修饰的Extensions使用消息派发。
Swift中函数派发查看方式:可将Swift代码转换为SIL(中间码)
swift -emit-silgen -0 example.swift
3.Swift如何显示指定派发方式
添加final关键字的函数使用直接派发;
添加static关键字函数使用直接派发;
添加dynamic关键字函数使用消息派发;
添加@objc关键字的函数使用消息派发;
添加@inline关键字的函数会告诉编译器可以使用直接派发。
4.Struct和Class的区别
(1)Struct不支持继承,Class支持继承;
(2)Struct是值类型,Class是引用类型;
(3)Struct使用let创建不可变,Class使用let创建可变;
(4)Struct无法修改自身属性值,函数需要添加mutating关键字;
(5)Struct不需要deinit房费,因为值类型不关系引用计数,Class需要deinit方法;
(6)Struct初始化方法是基于属性的。
5.Swift中的常量和Objective-C中的常量有什么区别
Objective-C中的常量(const)是编译期决定的,Swift中的常量(let)是运行时确定的。
6.?和??的区别
?用来声明可选值,如果变量未初始化则自动初始化nil;在操作可选值时,如果可选值是nil则不响应后续的操作;使用as?进行向下转型操作。
??用来判断左侧可选值非空时返回左侧可选值,左侧可选值为空(nil)则返回右侧的值。
7.Swift中mutating的作用
Swift中协议是可以被Struct和Enum实现的,mutating关键字是为了能在被修饰的函数中修改Struct和Enum的变量值,对Class完全透明。
8.Set(集合类型)的使用场景
集合(Set)用来存储相同类型并且没有确定顺序的值,当集合元素顺序不重要时或者希望确保每个元素只出现一次时可以使用集合而不是数组。Set存储值类型相同、无序、去重。
9.final关键词的用法
final关键词的作用:它修饰的类(Class)、方法(func)、变量(var)是不能被继承或重写的,编译器会报错。另外,通过它可以显示的指定函数的派发机制。
10.lazy关键词的用法
lazy关键词的作用:制定延时加载(懒加载),懒加载存储属性只会在首次使用时才会计算初始值属性。懒加载属性必须声明(var)为变量,因为常量属性初始化之前会有值。
11.Swift中的访问控制权限
Open:实体可被同一模块内所有实体访问,模块外可导入该模块即可访问,模块外可被继承和重写。
Public:实体可被同一模块内所有实体访问,模块外可导入该模块即可访问,模块外不能被继承和重写。
internal:实体可被同一模块内所有实体访问,模块外无法访问,大部分实体默认是internal级别。
fileprivate:限制实体只能在当前文件内访问到,不管是否在本类的作用域。
private:限制实体只能在本类的作用域且在当前文件内能访问。
关于嵌套类型:嵌套类型的访问级别和包含它的类型访问级别一致。但是public除外,在public修饰的类中定义嵌套类型默认为internal访问级别。
12.Any和AnyObject的区别
AnyObject只能表示引用类型的任何实例,相当于Objective-C中的id类型。
Any可以表示类、结构体、枚举的任何实例。
AnyObject是Any的子集。
13.Swift的Copy On Write机制是什么
1)Swift中参数传递是值类型传递,它会对值类型进行copy操作,当传递一个值类型变量时(变量赋值,函数传参),它传递的是一份新的copy值,两个变量指向不同的内存区域。如果频繁操作的变量占内存较大,会产生性能问题。
2)Copy On Write是一种优化值类型copy的机制,对String,Int,Float等非集合数据类型,赋值直接拷贝,对于Array等集合类型数据,只有传递的内容值改变后才进行拷贝操作。
3)Copy On Write的实现:set函数中判断是否存在多个引用,只有存在多个引用的情况下才会进行拷贝操作。另外自定义结构体是不支持Copy On Write的。