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