Post

Swift学习笔记

该記事主要记录了我在学习Swift时觉得有趣的内容或是与其他语言的对比

字符串插值

string interpolation 在python并不存在这样的写法。

1
2
3
var name = "Cuo"
print("I'm \(name)")
>> "I'm Cuo\n"

Type

Swift会默认推断浮点数的类型时Double

数值字面量

可以在数值中添加0或_,这并不会改变数值 var hoge = 00_012.233

函数

在Swift中函数的定义略显特殊

1
2
3
func functionName(parameterName: parameterType) -> returnType{
    mainCode
}

除了制定参数的Type外, 还需要显示的声明返回值的类型. 而在引用函数时则需要像functionName(parameterName: parameter)这样显示的写出参数名。 若想使用位置参数, 则需要在定义函数时在变量名前加上”_ “ eg. (_ parameterName)

类/对象

在Swift中定义Class的方法如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class ClassName: ParentClass{
    // 声明属性, 所有的属性都必须被赋值
    let constantProperty: Type = something	// 可通过声明来赋值
    var variableProperty: Type				// 也可以先声明, 然后通过构造器赋值

    init(variableProperty: Type){			// 通过构造器赋值
        self.variableProperty = variableProperty	// 将构造器参数赋值给实例变量
        super.init(parentClassProperty: parameter)  // 继承父类构造器
        parentClassProperty = something				// 改变父类中通过声明赋值的属性的值
    }

    var otherProperty: Type {
        get { do something }			// 在Swift中你可以使用计算属性; 可以轻松的监测值的变化
        set { do something }			// get, set可以在构造器初始化类实例时工作
        willSet { do something }		// willSet, didSet虽不能监测到构造器中发生值的情况
        didSet { do something }		// 但能在设置新值之前或之后工作
    }

    // 继承方法
    override func parentClassFunc() -> returnType{	// 注意override的位置与写法
        function body
    }
}

这一步分中最大的亮点应该就是计算属性了。 通过这种机制可以在监测某些值的变化, 并在变化后轻松的做出相应动作。 别的注意点则是override的位置, 构造器不需要作为一个方法来定义。

协议和扩展

用 protocol来声明一个协议。 协议是用来限定或者说为类,枚举,结构体制定标准的语法。

数组 [Arrays] 集合 字典<Key, Value>

a == a(自反性) a == b意味着 b == a(对称性) a == b && b == c意味着 a == c(传递性)

Arrays

数组是可以遍历的,同样的您也可以使用enumerated()方法使其返回索引与数据值。

1
var favoriteGenres = ["Jazz", "Classical", "Hip hop"]

Arrays.remove(at: Int)

Set

集合是无序的,且每个值都应是独一无二的(遵循Hashable协议)。与数组相同集合也是可遍历的,若想按照特定的顺序遍历集合中的值可以使用sorted()。

1
var favoriteGenres:Set = ["Jazz", "Classical", "Hip hop"]

基本集合操作

a AND b a.intersection(b) NOT a AND b a.symmetricDifference(b) a OR b a.union(b) a not b a.subtracting(b) 判断全等 == 判断子集 isSubset(of: ) etc……

Dictionary

字典的Key也应是独一无二的(遵循Hashable协议)。

1
2
3
var namesOfIntegers = [Int: String]()
namesOfIntegers[16] = "sixteen"
var otherNameOfIntegers = [16: "sixteen"]	// 推奨

Loop

stride(from: to: by: ) 半开区间 stride(from: through: by: ) 闭区间 该方法可以指定区间与步进。 eg. stride(from: 0, to: 60, by: 5)

switch

case分支用where来判断额外条件

1
2
3
4
5
6
7
8
9
10
let yetAnotherPoint = (1, -1)
switch yetAnotherPoint {
case let (x, y) where x == y:
    print("(\(x), \(y)) is on the line x == y")
case let (x, y) where x == -y:
    print("(\(x), \(y)) is on the line x == -y")
case let (x, y):
    print("(\(x), \(y)) is just some arbitrary point")
}
// 输出“(1, -1) is on the line x == -y”

复合型Cases

如果多种条件可以使用同一方法处理时,可以将这些条件用逗号隔开,放置于同一case后。这种写法称为复合型Cases

This post is licensed under CC BY 4.0 by the author.

Trending Tags