Swiftスタート

8674 ワード

原文はSwift公式サイトより
バージョンの表示
$ swift --version
Apple Swift version 2.2-dev (LLVM ..., Clang ..., Swift ...)

REPL
パラメータのないSwiftコマンドを実行する場合は、REPL(Read-eval-print-loopインタラクティブ解釈器)を使用して、swiftのインタラクティブ解釈器が入力したswiftコードを直接読み取り、計算、印刷することができます.
$ swift
Welcome to Apple Swift version 2.2. Type :help for assistance.
  1>
  • XcodeのPlaygroundはまさにREPLに基づいて実行実装をリアルタイムで解釈している.

  • インタラクション解釈器では、Darwin(DarwinはMacOSの最下位コア)のようなシステムモジュールを直接参照することもできる.
    1> import Darwin
    2> arc4random_uniform(10)
    $R0: UInt32 = 4
    

    パッケージ命令
    Swiftのパッケージマネージャは、パッケージを構築したり、ファイルを実行したり、異なるpackageを使用してコードを共有したりするための開発者の習慣に合ったシステムを提供しています.ローカルのswift開発パッケージのインストールが完了すると、パッケージ管理ツールを直接呼び出すことができます:swift package, swift run, swift build and swift test:
    $ swift package --help
    OVERVIEW: Perform operations on Swift packages
    ...
    

    1.パッケージの作成
    ステップ1:Helloという名前のフォルダを作成します.
    $ mkdir Hello
    $ cd Hello
    

    ステップ2:各パッケージには、Package.swiftというmanifestファイルがルートディレクトリ、すなわちこのときのHelloフォルダに配置されます.最低構成のパッケージを生成するようにコマンドすることもできます.swift package init initコマンドは、デフォルトで次のパッケージディレクトリ構造を生成します.
    ├── Package.swift
    ├── README.md
    ├── Sources
    │   └── Hello
    │       └── Hello.swift
    └── Tests
        ├── HelloTests
        │   └── HelloTests.swift
        └── LinuxMain.swift
    

    2.パッケージの構築
    次に、swift buildコマンドを使用して、構成ファイルmanifestに導入された依存ファイルをダウンロード、分解、コンパイルするパッケージを構築できます.
    swift build
    Compile Swift Module 'Hello' (1 sources)
    

    テスト実行パッケージ:swift test
    Compile Swift Module 'HelloTests' (1 sources)
    Linking ./.build/x86_64-apple-macosx10.10/debug/HelloPackageTests.xctest/Contents/MacOS/HelloPackageTests
    Test Suite 'All tests' started at 2016-08-29 08:00:31.453
    Test Suite 'HelloPackageTests.xctest' started at 2016-08-29 08:00:31.454
    Test Suite 'HelloTests' started at 2016-08-29 08:00:31.454
    Test Case '-[HelloTests.HelloTests testExample]' started.
    Test Case '-[HelloTests.HelloTests testExample]' passed (0.001 seconds).
    Test Suite 'HelloTests' passed at 2016-08-29 08:00:31.455.
         Executed 1 test, with 0 failures (0 unexpected) in 0.001 (0.001) seconds
    Test Suite 'HelloPackageTests.xctest' passed at 2016-08-29 08:00:31.455.
         Executed 1 test, with 0 failures (0 unexpected) in 0.001 (0.001) seconds
    Test Suite 'All tests' passed at 2016-08-29 08:00:31.455.
         Executed 1 test, with 0 failures (0 unexpected) in 0.001 (0.002) seconds
    

    3.実行可能ファイルの構築
    構築ターゲットtargetにmain.swiftが含まれている場合、このtargetは実行可能ファイルとして扱われ、パケットマネージャはこのmainファイルをバイナリ実行可能ファイルにコンパイルします.
    次は栗を作ります.このバッグはHelloという実行可能なファイルを生成し、「Hello,world!」の出力を実行します.
    ステップ1:ディレクトリを作成してアクセス
    $ mkdir Hello
    $ cd Hello
    

    ステップ2:実行可能ファイルタイプとして指定されたパッケージの初期化
    swift package init --type executable
    

    ステップ3:swift run命令を使用して、上記の初期化後の実行可能ファイルを構築し、実行します.
    swift run Hello
    
  • ヒント:このパッケージディレクトリには実行可能なファイルが1つしかないので、実行ファイルの名前を省略して、swift runを直接使用することができます.
  • swift buildコマンドでこのパッケージをコンパイルしてから、buildディレクトリの下でバイナリファイルを実行します.
    $ swift build
    Compile Swift Module 'Hello' (1 sources)
    Linking ./.build/x86_64-apple-macosx10.10/debug/Hello
    
    >$ .build/x86_64-apple-macosx10.10/debug/Hello
    Hello, world!
    

    次に、新しいソースファイルでメソッドsayHello(name:)を定義し、実行可能ファイルに定義したこのメソッドを実行させます.
    外部パラメータを受信するパッケージの構築
    ステップ1:Sources/Helloディレクトリに新しいファイルGreeter.swiftを作成し、次のコードを入力します.
    func sayHello(name: String) {
        print("Hello, \(name)!")
    }
    
  • このsayHello(name:)メソッドは、パラメータとして文字列を受信し、「Hello」をつなぎ合わせて印刷します.

  • ステップ2:main.swiftファイルを開き、中のコードを置き換えます.
    if CommandLine.arguments.count != 2 {
        print("Usage: hello NAME")
    } else {
        let name = CommandLine.arguments[1]
        sayHello(name: name)
    }
    
    main.swiftは、これまでハードコーディングされていた方法よりも、コマンドラインからパラメータを読み出し、sayHello(name:)の方法で処理して出力する.
    ステップ3:swift runを再実行し、新しいバージョンのHello実行ファイルを生成します.
    $ swift run Hello `whoami`
    
  • モジュールの構築方法、依存の導入、システムに付属するライブラリへのインデックス付けなど、Swiftパッケージマネージャについて学習する必要がある場合は、Swift Package Managerを参照してください.

  • LLDBデバッガの使用LLDBデバッガを使用してswiftプログラムを一歩一歩実行し、ブレークポイントを設定し、プログラムの状態をチェックし、変更することができます.
    栗を挙げると、以下のコードはfactorial(n:)メソッドを定義し、呼び出した後に実行結果を印刷します.
    func factorial(n: Int) -> Int {
        if n <= 1 { return n }
        return n * factorial(n: n - 1)
    }
    
    let number = 4
    print("\(number)! is equal to \(factorial(n: number))")
    
    Factorial.swiftファイルを作成し、上のコードcopyをファイルにコピーし、swiftcコマンドを実行して、このファイルのファイル名をパラメータとして、-gオプションとともにデバッグ情報を生成します.実行すると、現在のディレクトリにFactorialという実行可能ファイルが生成されます.
    $ swiftc -g Factorial.swift
    $ ls
    Factorial.dSYM
    Factorial.swift
    Factorial(Unix     )
    
    swiftcコマンド(javacやgccのようなコンパイルツール)を使用してswiftファイルをコンパイルすると、コンパイル情報を出力できます.その後、run命令を適用して直接プログラムを実行するのではなく、LLDBに変更して実行します.LLDBデバッガを使用するには、プログラムをパラメータとしてlldb命令の後ろに入力する必要があります.
    $ lldb Factorial
    (lldb) target create "Factorial"
    Current executable set to 'Factorial' (x86_64).
    (lldb) ...        ...
    

    インタラクティブコンソールが表示され、lldbコマンドを実行します.
  • LLDBの詳細については、LLDB Tutorial.を参照してください.
  • b命令(breakpoint set)を使用して、factorial(n:)メソッドの2行目にブレークポイントを設定し、この行コードが実行されるたびにプログラム間欠が取得される.
    (lldb) b 2
    Breakpoint 1: where = Factorial`Factorial.factorial (Swift.Int) -> Swift.Int + 12 at Factorial.swift:2, address = 0x0000000100000e7c
    
    r命令(run)を使用してプログラムを実行し、rを入力して車に戻った後、プログラムが実行され、factorial(n:)メソッドの呼び出しスタックを停止します.
    (lldb) r
    Process 40246 resuming
    Process 40246 stopped
    * thread #1: tid = 0x14dfdf, 0x0000000100000e7c Factorial`Factorial.factorial (n=4) -> Swift.Int + 12 at Factorial.swift:2, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
        frame #0: 0x0000000100000e7c Factorial`Factorial.factorial (n=4) -> Swift.Int + 12 at Factorial.swift:2
       1    func factorial(n: Int) -> Int {
    -> 2        if n <= 1 { return n }
       3        return n * factorial(n: n - 1)
       4    }
       5
       6    let number = 4
       7    print("\(number)! is equal to \(factorial(n: number))")
    
    p命令(print)を使用して、パラメータnの値を表示します.
    (lldb) p n
    (Int) $R0 = 4
    
  • p命令もswift式を計算できる:
  •   (lldb) p n * n
      (Int) $R1 = 16
    
    bt命令(backtrace)を使用して、factorial(n:)へのフレームワークを表示します.
    (lldb) bt
    * thread #1: tid = 0x14e393, 0x0000000100000e7c Factorial`Factorial.factorial (n=4) -> Swift.Int + 12 at Factorial.swift:2, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
      * frame #0: 0x0000000100000e7c Factorial`Factorial.factorial (n=4) -> Swift.Int + 12 at Factorial.swift:2
        frame #1: 0x0000000100000daf Factorial`main + 287 at Factorial.swift:7
        frame #2: 0x00007fff890be5ad libdyld.dylib`start + 1
        frame #3: 0x00007fff890be5ad libdyld.dylib`start + 1
    
    c命令(continue)を使用して、次のブレークポイントに遭遇するまでプログラムを続行します.
    (lldb) c
    Process 40246 resuming
    Process 40246 stopped
    * thread #1: tid = 0x14e393, 0x0000000100000e7c Factorial`Factorial.factorial (n=3) -> Swift.Int + 12 at Factorial.swift:2, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
        frame #0: 0x0000000100000e7c Factorial`Factorial.factorial (n=3) -> Swift.Int + 12 at Factorial.swift:2
       1    func factorial(n: Int) -> Int {
    -> 2        if n <= 1 { return n }
       3        return n * factorial(n: n - 1)
       4    }
       5
       6    let number = 4
       7    print("\(number)! is equal to \(factorial(n: number))")
    

    パラメータnの値を表示するには、p命令を再度使用します.
    (lldb) p n
    (Int) $R2 = 3
    
    br di命令(breakpoint disable)を使用してすべてのブレークポイントを閉じ、c命令でプログラムを続行します.
    (lldb) br di
    All breakpoints disabled. (1 breakpoints)
    (lldb) c
    Process 40246 resuming
    4! is equal to 24
    Process 40246 exited with status = 0 (0x00000000)
    

    #締めくくり
    SwiftのREPL、システムの構築、デバッガについて説明しましたが、より深い学習が必要な場合は、参考にしてください.
  • Swift構築システムとパッケージマネージャ
  • を深く学ぶ
  • Swiftコミュニティで活躍
  • AppleのSwift開発リソース