iOS 15 Programming Fundamentals with SwiftのI-5とI-6を読んだので不明点をまとめる

I. Languageの
5. Flow Control and More
6. Structured Concurrency
で不明点をまとめる


・unwrap

let opt:Int? = 2
if let unwrap = opt {
    print(unwrap)
}

後は、guard let
https://qiita.com/solty_919/items/8b22c8b30cd1a5596c83

 

・case-let

//optionalも条件にできる
let caseOptional: Int? = 5
switch caseOptional {
case 1?:
    print("optional 1")
case let n?:
    print("optional \(n)")
case nil:
    print("nil")
}

//インスタンスの比較もできる
switch d {
case let nd as NoisyDog:
    nd.beQuiet()
case let d:
    d.bark()
}

//pairで比較もできる
let caseOptional2: Int? = 5
let caseOptional3: String? = "masterka"
switch(caseOptional2, caseOptional3) {
case let(size, desc) as (Int, String) :
    print("\(size) \(desc)")
default:
    print("default!")
    break
}

//enumで比較もできる
enum MyError {
    case number(Int)
    case other
}

let err = MyError.number(10)
switch err {
case .number(let number):
    print("number \(number)")
case .other:
    print("other")
}

//enumの値で比較もできる
switch err {
case let .number(n) where n > 0:
    print("plus number \(n)")
case let .number(n) where n <= 0:
    print("minus number \(n)")
case .other:
    print("other")
default:
    print("err default")
}

 

・try

func canThrowOrReturnString(shouldThrow: Bool) throws -> String {
    if (shouldThrow) {
        throw APIError.network
    }
    return "how"
}

do {
    let result = try canThrowOrReturnString(shouldThrow: true)
    print(result)
} catch {
    print (error)
}

//trueだとクラッシュする。catchしない
let result2 = try! canThrowOrReturnString(shouldThrow: false)
print(result2)

//catchの代わりにelseにする
if let result3 = try? canThrowOrReturnString(shouldThrow: true) {
    print(result3)
} else {
    print("?exception")
}

 

・async-await

func download(url:URL) async throws -> Data {
    let result = try  await URLSession.shared.data(from: url)
    return result.0
}

let url = URL(string: "https://www.yahoo.co.jp")!
//async awaitはTaskからしか呼べない
Task {
    do {
        let data = try await download(url:url)
        let str: String? = String(data: data, encoding: .utf8)
        print(str)
    } catch {
        print(error)
    }
}

 

・Actor
Actorはオブジェクトタイプ
バックグラウンドで常に動くならActorに入れるとのこと。
https://qiita.com/h1d3mun3/items/f6ae63368e133e212115

@MainActor
だとメインスレッドになる

Task.detached
でバックグラウンドスレッドになる

関連記事:

Pocket