Swift学习之旅

2018-03-05  本文已影响0人  zzz_zk

基本语法

Swift和Objective-C对比,新出现关键字

deinit
extension
inout
internal
operator
subscript
typealias

类型别名

typealias Feet = Int
var distance:Feet = 13

类型安全,在编译期间就进行类型检查

变量和常量定义

var 表示是变量,可以修改指针指向
let 表示是常量。

0b 二进制
0o八进制
0x十六进制

var age : Int?
表示age变量默认值是nil

switch

字符串

var test = String("Hello world")
if test.isEmpty { //todo } 判断字符串是否为空

let stringA = String("haha")
stringA += "wawa" // 编译出错,let标识常量,不能修改

字符Character

数组

var mutableArray : Array<String> = ["xixi", "haha", "hoho"];
var mutableArray1 : [String] = ["xixi", "haha", "hoho"];
var emptyArray = [String]();
let unMutableArray = Array<String> = ["xixi", "haha", "hoho"];
for (index, item) in someStrs.enumerated() {
    print("在 index = \(index) 位置上的值为 \(item)")
}

元组

字典

var someDict:[String:Int] = ["A":1,"B":2]
var someDict = [String:Int]()

函数

func makeCoffee(type : String = "卡布奇诺") {
    print(type);
}

makeCoffee() // 打印结果 卡布奇诺
makeCoffee(type: "拿铁") // 打印结果 拿铁
func swap(_ a:inout Int, _ b:inout Int) { }
var x = 1; var y = 5
swap(&x, &y) 
func add(a:Int, b:Int)->Int {
    return a + b
}
var addition:((Int, Int)->Int) = add
print(addition(1,2))

Swift 中的类并不是从一个通用的基类继承而来。如果你不为你定义的类指定一个超类的话,这个类就自动成为基类。

可选链

可以通过连接多个可选链式调用在更深的模型层级中访问属性、方法以及下标。然而,多层可选链式调用不会增加返回值的可选层级。

如果你访问的值不是可选的,可选链式调用将会返回可选值。
如果你访问的值就是可选的,可选链式调用不会让可选返回值变得“更可选”。
因此:

通过可选链式调用访问一个Int值,将会返回Int?,无论使用了多少层可选链式调用。
类似的,通过可选链式调用访问Int?值,依旧会返回Int?值,并不会返回Int??。

扩展

添加计算型属性和计算型类型属性
定义实例方法和类型方法
提供新的构造器
定义下标
定义和使用新的嵌套类型
使一个已有类型符合某个协议

可选的协议要求

协议可以定义可选要求,遵循协议的类型可以选择是否实现这些要求。在协议中使用 optional 关键字作为前缀来定义可选要求。可选要求用在你需要和 Objective-C 打交道的代码中。协议和可选要求都必须带上@objc属性。标记 @objc 特性的协议只能被继承自 Objective-C 类的类或者 @objc 类遵循,其他类以及结构体和枚举均不能遵循这种协议。

使用可选要求时(例如,可选的方法或者属性),它们的类型会自动变成可选的。比如,一个类型为 (Int) -> String 的方法会变成 ((Int) -> String)?。需要注意的是整个函数类型是可选的,而不是函数的返回值。

协议中的可选要求可通过可选链式调用来使用,因为遵循协议的类型可能没有实现这些可选要求。类似 someOptionalMethod?(someArgument) 这样,你可以在可选方法名称后加上 ? 来调用可选方法。详细内容可在可选链式调用章节中查看。

下面的例子定义了一个名为 Counter 的用于整数计数的类,它使用外部的数据源来提供每次的增量。数据源由 CounterDataSource 协议定义,包含两个可选要求:

@objc protocol CounterDataSource {
    @objc optional func incrementForCount(count: Int) -> Int
    @objc optional var fixedIncrement: Int { get }
}

访问控制

模块和源文件

自定义运算符

当使用自定义运算时, 传入的参数至少要有一个当前对象, 否则编译不会通过。定义前缀或后缀运算符时,不要指定优先级。但是,如果将前缀和后缀运算符应用于相同的操作时,则首先进行后缀运算。

上一篇下一篇

猜你喜欢

热点阅读