02.SWIFTの基礎


UdemyでiOSアプリケーション開発講座を聴いていますが、記録を残すために公式ファイルを読んでいます(docs.swift.org).以下はSWIFTベースについて注目すべきものです.
Type Annotations
定数または変数宣言では、代入可能なデータ型を予め指定できます.もちろん,あらかじめデータ型が定められていなくても,SWIFT言語はその変数のデータ型を自動的に推定する.
// variable에 데이터 타입을 직접 명시하는 경우
var welcomeMessage: String
welcomeMessage = "Hello"
print(welcomeMessage) // Hello

// variables에 데이터 타입을 직접 명시하는 경우
var red, green, blue: Double
green = 323333333333333312
print(green) // 3.233333333333333e+17

// constant 이름을 emoji로 선언하면서 value를 대입하는 경우
let 📱 = "iPhone"
print(📱) // iPhone
Semicolons
他のプログラミング言語とは異なり、swiftは文の末尾にセミコロン(;)必ずしも使う必要はありません.しかし、複数の文を1行に書くには、セミコロンで区切らなければなりません.
let cat = "🐱"; print(cat) // 🐱
Integers
インテルのデータ型は、C言語のインテルのデータ型とほぼ同じです.これに加えて、SWIFTは8ビットの暗号化されていないIntegerでUInt8というデータ型を表すこともでき、UInt8にはminmaxの属性があり、Int型の最大/最小値を直接導出することができる.この場合、UInt8のように、範囲が予め定められたデータ型は、その範囲内の値のみに代入されなければならない.
// UInt8의 최대값과 최소값
let minValue = UInt8.min, maxValue = UInt8.max
print(minValue) // 0
print(maxValue) // 255

// UInt8의 최소값, Int8의 최대값
let cannotBeNegative: UInt8 = -1 // error
let tooBig: Int8 = Int8.max + 1 // error
一方、Intタイプは、Double()関数を使用してFloating-Point(すなわち、小数点を有するデータ型)に簡単に変更できます.
let three = 3, point = 0.14159
let pi = Double(three) + point
print(pi) // 3.14159
Type Aliases
SWIFTは、データ型に対してAliasを指定することができる.
typealias sample = UInt16
var num = sample.min
print(num) // 0
Tuples 🖇
Tuplesは、複数の値を組み合わせた機能を実行します.この場合、1つのインスタンスを1つのデータ型に統一する必要はありません.例えば、HTTPステータスコードの(404, "Not Found")は、非常に代表的なtupleの例と言える.
このHTTP状態コードは「(Int, String)型のtuple」と言え,割当て(分解)を分解することで個々の値にアクセスできる.割り当てたくない値がある場合は、下線()でtupleから除外できます.
// Tuple 선언
let httpError = (404, "Not Found")

//  분해할당을 통해 Tuple 내 value들을 세부 선언
let (code, msg) = httpError

print("The status code is \"\(code)\"")
// The status code is "404"
print("The status code is \"\(httpError.0)\"")
// The status code is "404"

print("The status message is \"\(msg)\"")
// The status message is "Not Found"
print("The status message is \"\(httpError.1)\"")
// The status message is "Not Found"

// Tuple 안에서 상태 메시지 value를 underscore로 배제
let (onlyThis, _) = httpError

print("The status code is \"\(onlyThis)\"")
// The status code is "404"
一方、tupleの各値についてはdictionaryのように最初からkey: valueと宣言してもよい.このようにtupleが宣言されると、keyはそのtupleの属性(attributite)となるので、Tuple.keyと同じ形式で値を呼び出すことができる.
// 분해할당 하지 않고 Tuple 선언
let httpOk = (code: 200, msg: "OK")

print("The status code is \"\(httpOk.code)\"")
// The status code is "200"
print("The status code is \"\(httpOk.0)\"")
// The status code is "200"

print("The status message is \"\(httpOk.msg)\"")
// The status message is "OK"
print("The status message is \"\(httpOk.1)\"")
// The status message is "OK"
Optionals 🤡
Optional & nil
データ型の条件に一致する値があるかどうか不明な場合は、「オプション」を使用します.これはC言語やObjective-C言語には存在しない概念である.少なくともObjective-C言語では、nilが返される場合がコンテキストに最も似ています.(換言すれば、SWIFTの傍観者は、Objective-Cのnilに対応するために導出された機能である可能性がある)😎)
代表的な例は、String"123"をInt 123に変換することである.Int 123が明示的に宣言されていない場所に導入された場合、SWIFTはこの機能を保持します.
「Integerのように見えますが、正確ではないかもしれません」
というニュアンスで、このデータ型がゆったりしていると推定します.もちろん、String「abc」をIntに変換しようとすると、このような推定は行われません.
let possible = "123"

// Swift가 알아서 Optional하게 데이터 타입을 추론
let converted1 = Int(possible)
print(converted1) // Optional(123)

// 처음부터 Optional한 데이터 타입이라고 선언
let converted2: Int? = Int(possible)
print(converted2) // Optional(123)
さらに,この原理を用いて,nilを汎用データ型として宣言された変数に代入することもできる.もちろん、非データ型の変数には、nilを代入することはできません.古いデータ型として宣言され、値が割り当てられていない場合、変数の値は自動的にnilになります.
// Optional한 데이터 타입의 default value
var optionalThing: String?
print(optionalThing) // nil

// Optional한 데이터 타입에 nil 대입
var ambiguous: Int? = 404
print(ambiguous) // Optional(404)

ambiguous = nil
print(ambiguous) // nil
If Statements and Forced Unwrapping
if文は、optionalがnilと比較され、optionalに値が含まれているかどうかを決定する.外来診療部に値がある場合、nilに等しくないと見なされる.
optionalに値が含まれていると確信している場合は、optional名の末尾に感嘆符(!)を追加して値にアクセスできます.これがいわゆる外部値強制分解(強制展開)である.
if notAmbiguous != nil {
    print("notAmbiguous has definite value of \(notAmbiguous!).")
}
Optional Binding
オプションバインド(Optional Binding)オプションに値が含まれているかどうかを確認し、値がある場合は一時定数または変数として使用できます.このためには、Forced Unwrappingメソッドの1つであるif文を使用します.
if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
    print("\(firstNumber) < \(secondNumber) < 100")
}
// Prints "4 < 42 < 100"

if let firstNumber = Int("4") {
    if let secondNumber = Int("42") {
        if firstNumber < secondNumber && secondNumber < 100 {
            print("\(firstNumber) < \(secondNumber) < 100")
        }
    }
}
Implicitly Unwrapped Optionals
番犬を作るためには、タイプの後ろに疑問符(String?)を書くよりも、感嘆符(String!)で暗黙的に包装をキャンセルした番犬を書くほうがいい.傍観者を使用する場合、名前の後ろに感嘆符を置くよりも、傍観者を宣言するときにタイプの後ろに感嘆符を置くほうがいい.
暗黙的な梱包解除は、最初に定義した後、値が存在することが確認され、その後のすべての時点で非常に役立ちます.これらの暗黙的なパッケージ解除のオプションは、主にクラスの初期化に使用されます.
暗黙的に包装を解除する外観は内部外観ですが、外観に近づくたびに外観の値を外す必要がなく、外観の値ではなく外観の値を使用するように使用できます.
let possibleString: String? = "An optional string."
let forcedString: String = possibleString!
// requires an exclamation point

let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString
// no need for an exclamation point
上記のコードでは、assumedStringはStringタイプであり、implicitStringではないので、implicitStringに値を割り当てる前に、強制的にパッケージをキャンセルされます.
逆に、次のコードでは、optionalStringは明確なタイプがないため、基本的にはオープンである.
let optionalString = assumedString
// The type of optionalString is "String?" and assumedString isn't force-unwrapped.
暗黙的にキャンセルされたパッケージの外観はnilで、パッケージの値に近づこうとすると、値のない外観の後ろに感嘆符が置かれているように動作時エラーが発生します.
Error Handling
SWIFTはcatchセクションとthrowsキーワードを使用してエラー処理を行います.特に、エラーが発生する可能性のある関数を呼び出す場合は、式の前にtryキーを付けます.
func makeASandwich() throws {
	// this function may or may not throw an error
}

do {
	try makeASandwich()
    eatASandwich()
} catch SandwichError.outOfCleanDishes {
	washDishes()
} catch SandwichError.missSalt(let salt) {
	goMarket(salt)
}
Assertions & Preconditions
「サポート」と「前提」の使用は、無効な条件が発生しないようにするために開発されました.Assertionはデバッグバージョンでのみチェックされます.代わりに、Preconditionはデバッグと本番バージョンでチェックされます.すなわち,生産構築時にAssertion内部の条件を実行しない.
Debugging with Assertions
SWIFT標準ライブラリのassert(_:_:file:line:)を使用してAssertionを作成します.通常、true/falseと判断された式とfalseであれば、その「」セクションに出力するメッセージが順次書き込まれます.
// assert 사용
let age = -3
assert(age >= 0, "A person's age can't be less than zero")

// assertionFailure 사용
if age > 19 {
	print("You can ride a car")
} else if age >= 0 {
	print("You are a human")
} else {
	assertionFailure("A person's age can't be less than zero")
}
Enforcing Preconditions
assert文と同様に、swift標準ライブラリのprecondition(_:_:file:line:)を使用してPreconditionを作成できます.使用法はassert文と同じです.通常、preconditionは、各条件が真であるかどうかを決定するために使用される.