スウィフトパーソナルスタディノート

この記事は純粋にスウィフトプログラミング言語の中国語版の研究ノートですので、ほとんどの内容は本文にあります。 この記事は私の研究ノートであり、正式なシステムレコードではありません。 参考のみ

私が理解していない、不確かなところはまだたくさんありますが、私は "疑念"の解説を指摘します。

中国語の翻訳者のおか​​げで、これはSwiftの学習スピードを大幅に加速しました。


リファレンス:

原作: スウィフトプログラミング言語
中国語版: Swift 3プログラミング言語

いくつかの分類できない知識:
1 – Swiftはmain()関数を必要としません。コードの最初の部分は、プログラムのエントリーポイントです。 (疑い)
2 – Swiftは、Cのように "宣言"と "定義"の概念を明確に区別していません。すべての定義は "宣言+定義"です。

変数と定数

変数と定数を宣言する

let aConstant = 42
let aConstantDouble : Double = 70   // 个人推荐

これは、続く値に基づいて定数の型を仮定します。 最初の例では、定数の型はInt設定されています。 2番目の例では、初期化値はIntですが、上記は明示的にこれがDouble型変数であることを示しているため、これはDouble型です。

変数はvar使用します。

アレイ

Swiftでは、配列と連想配列はプリミティブなデータ型(Objective-Cのクラス)になり、データ操作が大幅に簡素化されます。
宣言の方法は次のとおりです。

var shoppingList = ["catfish", "water", "popcorn"]
var shoppingList = [String]()

最初の行は定義+初期値です。 2行目は初期値を与えません

連想配列(辞書)

var aDict = [:]
var aDict = [String:Float]()        // 推荐
var aListOfSalaries = [
    "Andrew": 10000.0,
    "Bob": 15000.0
]

上記の2番目の方法は、連想配列のキーと値の型を特に制限する詳細な定義です。

制御フロー

基本的にCに似ていますが、かっこは必要ありません。 しかし、 {}ます。
条件付き操作は次のとおりifswitch
ループ操作はfor-inforwhilerepeat-while (do-whileではなく)です。

注意ifの条件は、通常の変数の値を判定条件として使用せず、ブール判定値のみを使用します。 たとえば、「 if some_value 」が不正なif some_value

オプションの変数

変数を宣言するときに?を追加すると、変数はオプションです(オプション)
この時点で、変数はnil値に設定できます。

このメソッドがC言語のポインタや他のメソッドのリファレンス(不確定)と同等であると思います。

ArrarとDictionaryのfor-in

for number in someArray {
    ...
}

for (kind, number) in someDictionary {
    ...
}

上記は " for-in "構文を使って配列と辞書にアクセスする方法です。 もちろん、配列とdictも入れ子にすることができます。

ループ

while n < 200 { ... }

repeat { ... } while m < 100

for i in 0..<4 {   }         // 表示 [0,4)
for i in 0...4 {   }         // 表示 [0,4]

関数とクラスター(クロージャー)

funcを使用してfuncを宣言し定義する:

func greeting (persion: String, day: String) -> String {
    ...
}

tupleを使用して、この関数でのみ使用される複合値( struct )を作成できます。

func calculate (scores:[Int]) -> (min: Int, max: Int, sum: Int) {
    ...
}

さらに、関数を値として返すこともできます:

func theFunc(number: Int) -> Int { ... }

func retuanAFunc() -> (Int -> Int) {
    return theFunc
}

関数を埋め込み、組み込み関数は外部変数にアクセスできます。

func someFunc() -> Int {
    var error: Int = 0
    ...
    func checkError() {
        if (...) { error = -1 }
    }
    ...
    return error
}

オブジェクトとクラス

classを作成するには、中括弧でキーワードclassを使用します。 他の形式の中括弧の効果を一目で見ると、スコープとしてのみ使用されます。

var anInstance = aClass    // 很像 C++

ドット構文を使用して、クラス内のメンバーやメソッドにアクセスします。

初期化関数: init 、Objective-Cのinitに近い
deinit機能:Objective-Cでdeinitに近いdeinit
メンバ関数のオーバーロード:funcの前にoverrideキーワードを付加しoverride

ゲッター/セッター

メンバを宣言するときに、getter / setterをさらに宣言することができます:

class SomeClass : FatherClass {
    var radius : Int
    init (radius : Int) {
        super.init (radius)
        self.radius = radius
    }
    
    var circle : Double {
        get {
            ...
        }
        set {
            ...        // setter的参数如果未定义的话,默认叫做 `newValue`。也可以显式地定义。
        }
    }
}

WillsetとdidSet

場合によっては、 willSetでset / get操作を実装する必要はなく、値の更新の前後で操作する必要がある場合は、この値のdidSet関数とdidSet関数を定義できます。

var squre : Double {
    willSet: {
        ...
    }
}

列挙と構造

これは実際に私が最も理解していないことの一つです。私は、最も基本的な部分だけを将来使用します。
enumを使用して列挙を作成します。 enum 可以包括函数

enum PokerFace {
    case ace = 1            // 注意这里如果不赋初始值的话,默认是 1
    case two, three, four, five, six, seven, eight, nine, ten
    case jack, queen, king
    func decription() -> String {
        switch self {
            case .ace:
                return "ace"
            case .jack:
                return "jack"
            case .queen:
                return "queen"
            case .king:
                return "king"
            default:
            return String (self.rawValue)        // Note
        }
    }
}

暗黙のrawValue値に注意してください。

コンストラクタを使用してenumのインスタンスを作成できます。

let aRank = Rank (rawValue : 3)
let aRank = Rank (.three)

struct使用してstruct定義する:

struct Card_st {
    var rank : Rank
    var suit : Suit
    func simpleDescription () -> String {
        return ...
    }
}

struct 的行为与class 很类似,但传递时,struct 传递的是拷贝,而class 传递的是引用
構造体には初期化子もあります

プロトコルと拡張

契約

protocol ExampleProtocol {
    var simpleDescription: String {get}
    mutating func adjust ()
}

文セクションの2行は、次の意味を表します。

  1. simpleDescritpionのStringのゲッターがあります
  2. 関数を宣言する:構造体の中身を変更できることを示すために、struct内でmutatingキーワードが使用されます。

クラス、構造体、列挙型はすべてプロトコルを持つことができます。

プロトコルの準拠を示すクラスを宣言します。コロンの後に追加するだけです。

class SomeClass : ExampleProtocol {
    ...
}

拡張

extansion Int: ExampleExtansion {
    ...
}

上記は、Int型に "ExampleExtension"という拡張を追加したものです。

この時点で、 "ExampleProtocol"というInt変数を作成できます。この時点で、 "ExampleExtension"のセマンティクスは "ExampleExtension拡張が追加されたInt型"になります。 これはクラスであるかのように継承する基本型です。

エラー処理

Error 协议に続くタイプを使用して、次のようなError 协议を示します。

enum ExampleError : Error {
    case outOfPaper
    case noToner
    case onFire
}

throwを使用してエラーをスローします。 throwsタグを使用すると、間違った関数がスローされます。

func send (job : Int, toPrinter printerName : String) throws -> String {
    ...
    if printerName == ... {
        throw ExampleError.noToner
    }
    return "..."
}

エラー処理方法1: do-catch

do {
    ...
} catch {
    print(error)        // 这个貌似是隐含的数据类型?不确定
}

エラー処理方法2: do + 多个catch

do {
    ...
} catch PrinterError.onFire {
    ...
} catch let printerError as PrinterError {
    print ("Printer error: \(printerError).")
} catch {
    print(error)
}

エラー処理方法3: try?
没明白

次へ

スウィフトパーソナルスタディノート – 02:基本的な内容

元のリンク