虽然 Metal 可以基于 Objective-C 和 C++ 书写,但是有很多的 Metal 文档和教程都是通过 Swift 进行书写的。因此,本篇笔记先做一些非常快速的 Swift 语言的复习。
变量声明
值类型声明
在 Swift 中,变量的声明可以通过以下的语法完成。
// 变量
var str = "Hello World"
var myVariable = 123
var myInt : Int = 5 // 显式声明类型
// 常量
let constantVariable = 123
let myExplicitDouble : Double = 5.0
// 数组
let intArray = [1,2,3,4,5]
let expIntArray : [Int] = [1,2,3,4,5]
// 数对
let fileNotFound = (404, "File Not Found")
let serverError = (code: 500, message: "Internal Server Error")
// 注意数对可以提供每个值的索引,所以我们可以通过serverError.message获取上面这个数对中的第二项
// 词典
var crew = ["A": "Tony", "B":"Aaron", "C":"Steve"]
print(crew["A"]) // "Tony"
crew["D"] = "Eric" // 把 ("D", "Eric") 加入词典
crew.removeValue(forKey:"D") // 移除("D", "Eric")
其中,关键字 var 和 let 的区别主要就在于变量是否可变。let 声明的变量是不可变的,如果在后文中对这个变量的值进行修改,编译器就会报错。
在 Swift 标准库中,所有集合类型,例如 Array,Dictionary,Set 都被设计成值类型,意味着当你把它们赋值给一个变量或常量,或把它们作为参数传递给函数时,实际上操作的是它们的拷贝。然而, Swift 采用了写时复制(Copy-on-Write, COW)的策略进行技术优化,以确保这些值类型行为更加高效。当你复制一个数组并修改任意一个数组的时候,实际的复制操作只会在需要修改数据时发生。
函数
声明
函数的声明可以通过如下的语法完成。
// 无参过程函数
func HelloWorld() {
print("Hello World")
}
// 无参有返回值函数
func MyNumber() -> Int {
return 123
}
// 有参函数
func Plus(firstVal: Int, secondVal: Int) -> Int {
return firstVal + secondVal
}
// 有参无标函数
func NoLabelPlus(_ num1 : Int, _ num2 : Int) -> Int {
return num1 + num2
}
// 有参默认值函数
func Increment(num1: Int, num2 : Int = 1) -> Int {
return num1 + num2
}
// 多同类型参数函数
func SumNumbers(numbers : Int...) -> Int {
var total = 0
for num in numbers {
total += number
}
return total
}
// inout 关键字传入引用
func Swap(firstVal : inout Int, secondVal : inout Int) {
(firstVal, secondVal) = (secondVal, firstVal)
}
使用
以上面的函数为例,以下是一些使用须知。
// 默认情况下,需要写出所有变量的label,也就是它们在函数里的假名
// 第一个可以省略
Plus(firstVal: 1, secondVal:2) // 3
Plus(1, secondVal: 3) // 4
// 对于有参无标函数,可以不写label
NoLabelPlus(1,2) // 3
// 对于有参默认值函数,不填默认值则使用默认值
Increment(1) // 2
// 多同类型参数函数,可以直接写在冒号后面
SumNumbers(numbers: 1,2,3,4) // 10
// inout传入引用时,要使用&操作符
var a = 1
var b = 2
Swap(firstVal : &a, secondVal : &b)
a // 2
b // 1
面向对象
类
对象
参考:
Learning Swift, 3rd Edition, Jonathon Manning
Comments