top of page
  • Writer's pictureLingheng Tao

Metal #0 Swift Review

虽然 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

面向对象




对象


 

参考:

  1. Learning Swift, 3rd Edition, Jonathon Manning

17 views0 comments

Recent Posts

See All

Metal #2 Rendering Pipeline

#ComputerGraphics #TechnicalArt #GameEngine 这篇文章主要关于 Metal 中的渲染管线知识点。

bottom of page