学習(SWIFT基本文法)-4


try-catch

enum PhoneError: Error {
	case unknown
    case batteryLow(batteryLevel: Int)
}
Errorを表すためには、Errorプロトコルを使用する必要があります.

エラーの処理方法


関数を呼び出すコードに関数のエラーを伝播する

func checkPhoneBatteryStatus(batteryLevel: Int) throws -> String {
	guard batteryLevel != -1 else { throw PhoneError.unknown }
    guard batteryLevel > 20 else { throw PhoneError.batteryLow(batteryLevel: batteryLevel) }
    return "배터리 상태가 정상입니다."
}

do-catch構文

do {
	try checkPhoneBatteryStatus(batteryLevel: -1)
} catch PhoneError.unknown {
	print("알 수 없는 에러입니다.")
} catch PhoneError.batteryLow(let batteryLevel) {
	print("배터리 전원 부족, 남은 배터리 : \(batteryLevel)%")
} catch {
	print("그 외 오류 발생 : \(error)")
}

オプションで処理

let status1 = try? checkPhoneBatteryStatus(batteryLevel: -1)
print(status1) // nil

let status2 = try? checkPhoneBatteryStatus(batteryLevel: 30)
print(status2) // Optional("배터리 상태가 정상입니다.")
発生したエラーをtry?に処理すると、nilに戻ります.
エラーが発生しないと確信した場合は、try!を使用してOptionalを強制解除することができます.(推奨X)

エンクロージャ


一級オブジェクト


伝達パラメータとして送信してもよいし、変数/定数を格納または伝達してもよいし、関数の戻り値としてもよい.
{ (매개 변수) -> 리턴 타입 in
	실행 구문
}

変数または定数の入力

let hello1 = { () -> () in
	print("hello")
}

hello1() // hello

let hello2 = { (name: String) -> String in
	return "Hello, \(name)"
}

hello2("Park") // Hello, Park
一般関数を呼び出すように、hello2(name: "Park")のように使用するとエラーが発生します.パラメータラベルを渡すには、多くのことを書きます.

パラメータとして関数に渡す

func doSomething1(closure: () -> ()) {
	closure()
}

doSomething1(closure: { () -> () in
	print("hello")
}) // hello

関数として使用される戻りタイプ

func doSomething2() -> () -> () {
	return { () -> () in
    	print("hello")
    }
}

doSomething2()() // 매개변수를 넣을 수 있는 곳이 2곳이라 이렇게 쓰나 보다.

後続エンクロージャ


後続のモジュールを使用すると、モジュールの説明を簡略化できます.
複数のパラメータキャビネットが渡された場合、後続のキャビネットとして使用できるのは、最後のパラメータに対応するキャビネットのみです.
doSomething1() {
	print("hello")
}
1つのモジュールのみをパラメータとして渡す場合は、パラメータ部分のカッコを省略することもできます.
doSomething1 {
	print("hello")
}

複数の後続エンクロージャ


複数のパラメータエンクロージャが渡された場合:
func doSomething3(success: () -> (), fail: () -> ()) {
}

doSomething3 {
	실행 코드
} fail: {
	실행 코드
}
最初のモジュールはパラメータラベルの転送を省略します

モジュール表示を簡略化する方法

func doSomething4(closure: (Int, Int, Int) -> (Int)) {
	closure(1, 2, 3)
}

doSomething4(closure: { (a, b, c) in
	return a + b + c
}) // 일반적인 호출

doSomething4(closure: {
	return $0 + $1 + $2
}) // 파라미터 형식 생략

doSomething4(closure: {
	$0 + $1 + $2
}) // 리턴 형식 생략(블록에 리턴 구문만 남는 경우에만 가능)

doSomething4() {
	$0 + $1 + $2
} // 후행 클로저 사용

doSomething4 {
	$0 + $1 + $2
} // 매개변수로 하나의 클로저만 전달되기 때문에 소괄호까지 생략 가능

高次関数


別の関数を、伝達パラメータまたは関数の実行結果を返す関数として受信します.
(map, filter, reduce)

map

let numbers = [0, 1, 2, 3]
let mapArray = numbers.map { (number) -> Int in
	return number * 2
}

print("map \(mapArray)") // map [0, 2, 4, 6]

filter

let intArray = [10, 5, 20, 13, 4]
let filterArray = intArray.filter { $0 > 5 } // 위에서 다룬 클로저 단순화 사용

print("filter \(filterArray)") // filter [10, 20, 13]

reduce

let someArray = [1, 2, 3, 4, 5]
let reduceResult = someArray.reduce(0) {
	(result: Int, element: Int) -> Int in
    	print("\(result) + \(element)")
        return result + element
} // 0은 초기값, result에는 누적값, element는 배열의 원소

print("reduce \(reduceResult)")
/*
	0 + 1
    1 + 2
    3 + 3
    6 + 4
    10 + 5
    reduce 15
*/

ソース


快速キャンパス、超差コース:SWIFTを使用して30項目のiOSアプリケーションを開発