Swift
支持“面向对象编程”或者“Functional 编程”【利用generics和extensions(default implementations)-》结合protocol】
CountableRange
1 |
|
let
let 所声明的变量统统为不可变的变量。是不能被再次赋值,包括修改。这一点跟 OC 中的不可变类型有区别【如NSMutableArray 与NSArray 】,OC 中是不能被修改,但是可以被重新赋值。
var
var 所声明的变量统统为可变的变量。【didSet关注更新】
1 | private(set) var flipCount = 0 { |
as 与 is
is用来判断是否为某种类型
1 | protocol Runnable {func run() } |
as用来类型转换
【“Guaranteed conversion”】
(1)从派生类转换为基类,向上转型(upcasts)
(2)消除二义性,数值类型转换
(3)switch 语句中进行模式匹配
【”Forced conversion“】
as! 向下转型(Downcasting)时使用。由于是强制类型转换,如果转换失败会报 runtime 运行错误。
as? 和 as! 操作符的转换规则完全一样。但 as? 如果转换不成功的时候便会返回一个 nil 对象。成功的话返回可选类型值(optional),需要我们拆包使用。
元组(tuple)
1 | let x: (String ,Int, Double) = ("hello", 5, 0.85) // the type of X is"a tuple" |
常用于函数返回值
1 | func getSize() -> (weight: Double, height: Double) { return (250, 80) } |
计算属性(Computed Properties)
The value of a property can be computed rather than stored【OC中虽然没有存储属性和计算属性的概念,但@property
关键字实际上也间接的完成了存储属性+计算属性的自动创建。】
OC的@property与Swift的存储属性/计算属性类比
1 | //A typical stored property looks something like this |
Accsess Control
- private - this means “only callable from within this ob ject”【只允许在当前定义体内使用。】
- private(set) - this means“this property is readable outside this object, but not settable”【此属性在对象之外可读,但不可设置】
- fileprivate - accessible by any code in this source fle【当前源文件访问。】
- internal - this is the default, it means “usable by any object in my app or framework ”【本模块能访问。不写访问控制关键字,默认为 internal。】
- public - (for frameworks only) this can be used by objects outside my framework【本模块和其他模块都能访问,不允许其他模块继承或重写。】
- open - (for frameworks only) public and objects outside my framework can subclass this【本模块和其他模块都能访问,只能应用在类或者类成员上。允许其他模块继承或重写。】
extension
就是为一个已有的类、结构体、枚举类型或者协议类型添加新功能。 Objective-C 中的分类类似【但Swift 的扩展没有名字】。
断言(Assertion)
assert
断言可以引发程序终止,并不是被设计用来避免不在发生无效情况的。在那些无效条件有可能触发的情况下,断言是一种有效的调试手段,可以确保在应用发布之前,在开发过程中就可以关注这些条件。
1 | let number = 3 |
enum
与C,Objective-C中的枚举相比,Swift中枚举功能更强大。它支持很多只有类才有的特性,如: Properties, Methods, Initialization, Extensions, Protocols.
(1)Swift枚举情况在创建时不分配默认整数值。
(2)变量只能是计算变量
Swift 枚举(enum)详解【注意递归枚举】
1 | //Associated Data |
mutating
Swift关键字(mutating)【编译成.sil文件,很强~新技能】
mutating:只用在值类型中,默认情况下,实例方法中是不可以修改值类型的属性,使用mutating后可修改属性的值
structure和enumeration是值类型(value type)-》通过复制传递【写时复制】,不会存在堆中
class是引用类型(reference type)。
inout
修改的是参数类型,在函数的声明中,默认的参数都是不可变的【想要可变,需要添加inout关键字】这样就变成传递的过程中传递的是地址【即引用】
1 | func swap(_ a: inout Int,_ b: inout Int) { |
optional
1 | enum |
syntactic sugar(这只是语法糖而已。)
?
声明可选,声明此时并不确定是否有值,所以只在有值时调用后面方法
??
双问号的意思是,判断前面的表达式的值为nil。否为前面的表达式的值,是为后面的值
当值为0时,是不走后面的值的
1
2//类似三元运算符
return emoji[card.identifier] ?? "?"
!
无须初始化,明确声明此时一定有值,无论什么情况都调用后面的方法。否则为nil,调后面的方法出现exception
_
忽略
nil
表示未设置的选项
swift中的Any与oc中的id
Swift 中的 Any ,它描述了一个任意类型的值,无论是类、枚举、结构体还是其他 Swift 类型。这个变化致使 Objective-C API 在 Swift 中更加灵活,因为 Swift 中定义的值类型可以传送到 Objective-C API 中并作为 Swift 类型展开,消除了手动“包装”类型的需求。这些好处同时扩展了集合:Objective-C 集合类型 NSArray 、 NSDictionary 以及 NSSet ,它先前只接受 AnyObject ,现在可以包含 Any 类型。对于哈希容器,比如 Dictionary 和 Set ,现在有新的类型 AnyHashable 能保存任何遵循 Swift 中Hashable 协议的类型。
Objective-C | Swift 2 | Swift 3 |
---|---|---|
id | AnyObject | Any |
NSArray * | [AnyObject] | [Any] |
NSDictionary * | [NSObject: AnyObject] | [AnyHashable: Any] |
NSSet * | Set |
Set |
ARC
strong
weak 【常用于outlet、delegation等指向引用类型的optional 指针】
unowned【closures】
protocol
OC和SwiftProtocol的共同点
本质都是抽取不同类的共同方法和属性(声明),供遵循协议的类或对象使用。
都可以通过定义协议实例deleagate,来实现委托代理模式。
PS:类比继承的概念,继承父类的方式比较险隘,子类和父类只能为同一基类,且方法都有实现,需在子类中override,并不能把方法和属性完全独立出来,且不能多继承。
OC和SwiftProtocol的区别(核心)
OC中的协议更单纯的受限于委托代理的含义,多用于跨类的传值和回调通知。
而Swift是面向协议编程,其思想是通过抽取不同类中的相同方法和属性,实现模块化减少耦合。
Swift可以通过协议extension扩展,缺省实现协议的方法(OC不行)。
Swift的协议不需要单独声明协议对象(id <Deleagate> delegate
)和指定代理(delegate = self
),只需要遵循协议的类实现声明,或使用协议的缺省实现。
使用
(1)属性要求:只能是计算属性。指定其读写性{ get set };var关键字修饰;可用static关键字实现类属性;不能设置默认值(默认值被看做是一种实现)。
(2)方法要求:
方法不能添加默认实现和默认参数(可使用扩展实现);
可用static关键字实现类方法;mutating修饰,方法实现时,满足结构体或枚举内部修改属性变量的情况。
协议的方法其实没有可选实现,加@objc optional是为了对应OC中的optional。
(3)协议可以作为类型使用;可看做一种特殊泛型。
(4)在协议后加class(或anyobject),标识只能被类类型遵守struct不行。
(5)在协议前加@objc,表示只能被OC或@objc的类遵循。
Delegation
定义协议实例deleagate
Function Types
You can declare a variable (or parameter to a method or whatever) to be of type “function Types“
1 | var operation: (Double) -> Double |
closures【引用类型,同class】
类似Objective-C
中的Block
或者Java
中的lambdas
。
闭包就是一个独立的函数,一般用于捕获和存储定义在其上下文中的任何常量和变量的引用。
1 | let primes = [2.0, 3.0, 5.0, 7.0, 11.0] |
【待补充 closures循环引用】
throw Error
1 |
|
win 与 macOS
苹果键盘 | 苹果符号 | 对应window键盘 |
---|---|---|
Cammand | ⌘ | win键 |
Option | ⌥ | alt键 |
Control | ^ | ctrl键 |
Shift | ⇧ | Shift键 |
Caps Lock | ⇪ 或者 . 中/英 | Caps Lock键 |