一、Swift 存储属性和计算属性比较:
存储型属性:用于存储一个常量或者变量 计算型属性: 计算性属性不直接存储值,而是用 get / set 来取值 和 赋值,可以操作其他属性的变化.
- 计算属性可以用于类、结构体和枚举,存储属性只能用于类和结构体。
- 存储属性可以是变量存储属性(用关键字 var 定义),也可以是常量存储属性(用关键字let定义),而计算属性只能用var定义
- 计算属性不直接存储值,而是提供一个 getter 和一个可选的setter,来间接获取和设置其他属性或变量的值
var age = 12
var name = "小花"
var kind = "法斗"
//定义计算属性的getter方法,该方法的返回值由age、name、kind三个存储属性决定
var petInfo:String{
get {
return "this is a pet which name is \(name),age is \(age), kind is \(kind)"
}
set (newInfo)
{
}
}
二、inout关键字有什么作用
需要用到inout 关键字,调用函数时加& inout关键字本质是通过地址传递进行值修改的
三、OC和Swift中的protocol
OC和SwiftProtocol的共同点
本质都是抽取不同类的共同方法和属性(声明),供遵循协议的类或对象使用。 都可以通过定义协议实例deleagate,来实现委托代理模式。 PS:类比继承的概念,继承父类的方式比较险隘,子类和父类只能为同一基类,且方法都有实现,需在子类中override,并不能把方法和属性完全独立出来,且不能多继承。
OC和SwiftProtocol的区别(核心)
OC中的协议更单纯的受限于委托代理的含义,多用于跨类的传值和回调通知。 而Swift是面向协议编程,其思想是通过抽取不同类中的相同方法和属性,实现模块化减少耦合。 Swift可以通过协议extension扩展,缺省实现协议的方法(OC不行)。 Swift的协议不需要单独声明协议对象(id delegate)和指定代理(delegate = self),只需要遵循协议的类实现声明,或使用协议的缺省实现。
四、Swift 中的 enum 和 OC 中 有什么区别
OC 1.oc的枚举值相当于这个文件中的一个局部变量,只能是整型 2.不同枚举中,枚举名称不可以一样,在同一文件 Swift 3.枚举里可以写方法 4.枚举的rawValue可以是Float(float也是赋值的后面依次+1)或是String,或是没有 5.可以用Rank(rawValue: 3)方法创建一个枚举实例 6.枚举实例可以带参数
五、struct和class的区别
1)swift中所有值类型:struct、enum使用直接派发。 2)swift中协议的extensions(类似于OC的分类)使用直接派发,初始声明函数使用函数表派发 3)swift中class中extensions使用直接派发,初始化声明函数使用函数表派发,dynamic修饰的函数使用消息派发。
Swift中,mutating关键字指的是可变即可修改。用在structure和enumeration中,虽然结构体和枚举可以定义自己的方法,但是默认情况下,实例方法中是不可以修改值类型的属性。为了能够在实例方法中修改属性值,可以在方法定义前添加关键字mutating。 在 Swift 中,值类型,存放在栈区;引用类型,存放在堆区。Swift 中,典型的有 struct,enum,以及 tuple 都是值类型。 当值类型的变量作为参数被传入函数时,相当于创建了新的常量并初始化为传入的变量值,该参数的作用域及生命周期仅存在于函数体内。 当引用类型的变量作为参数被传入函数时,相当于创建了新的常量并初始化为传入的变量引用,当函数体内操作参数指向的数据,函数体外也受到了影响 6.当你的项目的代码是 Swift 和 Objective-C 混合开发时,你会发现在 Objective-C 的代码里无法调用 Swift 的 Struct。因为要在 Objective-C 里调用 Swift 代码的话,对象需要继承于 NSObject。 7.内存分配:struct分配在栈中,class分配在堆中。struct比class更“轻量级”(struct是跑车跑得快,class是SUV可以载更多的人和货物) 3.struct是值类型(Value Type),深拷贝。class是引用类型(Reference Type),浅拷贝。
六、Swift optional是什么类型的
optional类型是一个枚举类型,有两个枚举值: 1、None类型 2、Some(Wrapped) 这两个类型决定了optional类型的概念和含义,有值或者没有值: 1)optional.None表示该类型没有值,也就是nil。(特别声明,swift中的nil不在有指针含义,而是表示且仅表示optional的.None)。 2)optional.Some(Wrapped)这是表示有值的情况,Some类似于java或者c++的泛类型的含义,Wrapped 类似是封装的值。
optional的wrap和unwrap
使用optional类型,该类型会对赋值过程和取值进行一些处理。 1)赋值也被称为装包的过程(wrap),optional类型会获取当前值的类型和具体值,如int类型的数字100.当一个optional类型被赋值为这个值时,其实optional记录了对应的类型(some)int,和值部分(wrapped)100. 2)取值也被称为解包的过程(unwrap),optional根据记录的类型(some)如上面说的int,和值部分(wrapped)100,新建一个some(wrapped)同int(100)返回给程序 optional是swift特别声明的安全类型,在使用过程中如果处理得当的话可以防止以前oc上很多因为数据没值导致的crash。个人还是比较推荐使用的,虽然有时候有些解包的过程感觉特别麻烦,但这都是一道道安全门,阻断了很多crash的诞生。