asyncはasynchronousの略のようです。訳は、非同期の、同じ速度で進まない、同時に起こらないといったようなことです。asyncは実行の途中で一時停止できる特別な種類の関数またはメソッドを示します。また、async letのように組み合わせて使うと、他の処理を先行させることもできます。awaitは途中で一時停止の可能性があるポイントを明示するためのマークのようです。例えば、
async let 非同期1 = await 遅延関数1(1)
//順番に実行されます
print("after1")
//順番に実行されます
let 普通2 = 関数1(2)
//順番に実行されます
print("after2")
//同一関数は一度に一つしか実行されません
async let 非同期3 = await 遅延関数1(3)
//順番に実行されます
print("after3")
//遅延関数1とは異なる関数なので遅延関数1が終わるより先に実行されます
async let 非同期4 = await 遅延関数2(4)
//順番に実行されます
print("after4")
//順番に実行されます
let 普通4 = 関数1(5)
//順番に実行されます
print("after5")
/*
after1
Check Number: 2
after2
after3
after4
Check Number: 5
Check Number: 4
after5
Check Number: 1
Check Number: 3
*/
func 遅延関数1(_ check: Int) async -> String {
for _ in 1...1000000 {
}
print("Check Number: \(check)")
return ("遅延1-\(check)")
}
func 遅延関数2(_ check: Int) async -> String {
for _ in 1...100000 {
}
print("Check Number: \(check)")
return ("遅延2-\(check)")
}
func 関数1(_ check: Int) -> String {
print("Check Number: \(check)")
return ("普通\(check)")
}
こんな感じです。asyncと明示した関数、メソッド、変数を参照するときはawaitをつけないとコンパイラーエラーになります。async letを使いawaitをつけいなとコンパイラーに警告されますが、実行されます。しかし、awaitをつけておけば、どこでasyncの関数やメソッドを参照しているかが、後でみてわかりやすくなるので、asyncとawaitはセットで使うことにしておいた方がよさそうです。