【独学】はじめてのiOSプログラミング – 練習問題 回答

練習問題4-1 回答

Xcodeを立ち上げた後に、メニューバーの「File」>「New」>「Project」でプロジェクト作成用のウィンドウを表示。
Product Nameに「Sample_Project」と入力してプロジェクトを作成。

練習問題4-2 回答

ContentView.swift

struct ContentView: View {
    var body: some View {
        Text("Hello 2020!")
                .padding()
    }
}

練習問題4-3 回答

UIウィンドウを表示し、UIの一覧から「Text」をプレビュー画面の「Hello 2022 !」の下にドロップ。次のようなコードを作成。

ContentView.swift

struct ContentView: View {
    var body: some View {
        VStack {
            Text("Hello 2022 !")
                .padding()
            Text("Text")
                .padding()
            }
        }
    }
}

練習問題4-4 回答

「VStack」を「HStack」に変更。

ContentView.swift

struct ContentView: View {
    var body: some View {
        HStack {
            Text("Hello 2022 !")
                .padding()
            Text("Text")
                .padding()
            }
        }
    }
}

練習問題4-5 回答

プレビュー画面の実行ボタンをクリック。

練習問題4-6 回答

ツールバーの実行ボタンをクリック。

練習問題5-1 回答

外観を変更するUIをプレビュー画面で選択し、ユーティリティエリアで属性を変更。

練習問題5-2 回答

ContentView.swift内の外観を変更したUIオブジェクトに追記されたメソッドを確認。

練習問題5-3 回答

次の2つの方法のうちどちらかを実行する。
・ユーティティエリアの属性を変更する部分で、入力値を変更する。
・コード内のメソッドの引数を変更する。

練習問題5-4 回答

次のようにコードを編集して処理の内容を定義。

Button("ボタンのキャプション") {
  このブロックに処理を記述
}

練習問題5-5 回答

次のように変数を定義。

struct ContentView: View {
    var text: String = "Hello, Text"
    var num: Int = 0
    
    var body: some View {

後略

練習問題5-6 回答

次のように変数をボタンのキャプションに指定。

struct ContentView: View {
    var text: String = "Hello, Text"
    var num: Int = 0
    
    var body: some View {
            Button(text) {
                
後略

練習問題5-7 回答

次のようにボタンを押した時にprintメソッドを実行する処理を指定。

struct ContentView: View {
    var text: String = "Hello, Text"
    var num: Int = 0
    
    var body: some View {
            Button(text) {
              print("hello)
          }
                
後略

練習問題5-8 回答

シミュレーターを起動してボタンをクリック。その後でXcodeのデバッグエリアのコンソールを確認。

練習問題6-1 回答

コード内の削除したいUIのインスタンスを削除。

練習問題6-2 回答

追加したUIにメソッドを追記。ユーティリティエリアでメソッドの属性に対する項目が増えていることを確認。

練習問題6-3 回答

String型のバインディング変数。

練習問題6-4 回答

Bindingとは、UIと変数を接続する意味。
UIの入力や動作などの動きが、特別な処理をすることなく自動的に変数に代入される仕組み全般のこと。

練習問題6-5 回答

変数を宣言するときに「@State」を変数の前につける。

練習問題6-6 回答

引数を指定するときに、変数の頭に「$」をつける。

練習問題6-7 回答

UIの操作時に実行できるメソッドをドキュメントで確認。
https://developer.apple.com/documentation/swiftui/view-input-and-events

ドキュメント内に「on〜」の書式のメソッドが操作時に実行されるメソッド。
その中から目的のメソッドをコードに記述して処理を作成。

練習問題6-8 回答

disabledメソッドを引数 true で実行。

制御したいUIのインスタンス.disabled(true)

練習問題6-9 回答

シミュレーターのメニューバーから
「I/O」→「Keyboard」→「Toggle Software Keyboard」を有効にする。

練習問題6-10 回答

アプリ全体を管理するクラスはUIApplicationクラス。sharedプロパティを利用して「UIApplication.shared」の書式で稼働中のUIApplicationオブジェクトを取得して処理を作成。
他クラスの処理をアプリ全体として実行したい場合は、sendActionメソッドで処理を作成。

練習問題6-11 回答

メソッドを引数にする=セレクタ。
セレクタの書式はメソッドを「#selector( )」内に記述。

練習問題7-1 回答

コード内のUIに該当する部分を削除

練習問題7-2 回答

プレビュー画面にUIのライブラリ一覧から「List」をドロップして次のようにコードを編集する。

List {
   Text("1")
   Text("2")
   Text("3")
   Text("4")
   Text("5")
}

練習問題7-3 回答

Identifiableプロトコルを継承した構造体を定義する。その構造体で1~5までのオオブジェクトの配列を生成し、Listのインスタンスの変数に指定する。

// 構造体の例
struct Item: Identifiable {
    var id = UUID()
    var title: String 
}

// 配列の例
let items = [Item(title:"1"), Item(title:"2"), Item(title:"3"), Item(title:"4"), Item(title:"5")]

// リストの例
List(self.items) {
   Text(item.title)
}

練習問題7-4 回答

ユニークとなるIDを自動的に生成するメソッド。

練習問題7-5 回答

UIからピッカーをプレビュー画面にドラッグ&ドロップ。
選択して表示するリストを編集。

練習問題7-6 回答

ピッカーのインスタンスでは、選択肢のリストを指定しない仕様になっているので、
ピッカーのインスタンスないのブロックで事前にしていした配列を選択肢として利用する処理を記述する必要がある。

練習問題7-7 回答

ピッカーのインスタンスに指定したバインディング変数で選択時のインデックスが取得可能。
onChangeメソッドで選択時の処理を作成して、インデックスから選択肢の該当する値を取得する処理を作成する。

// ピッカーの例 
Picker(selection: バインディング変数, label: Text) {
    // 選択肢の表示処理
}
.onChange(of: バインデンング変数) {
    // 選択時の処理
}

練習問題7-8 回答

地図はプレビュー画面での作成に対応していないので、次の手順でコードを記述して行う。
・MapKitのインポート
・MKCoordinateRegion 構造体で地図に表示する範囲を定義
・定義したMKCoordinateRegion 構造体を指定してMapのインスタンスを生成

練習問題7-9 回答

地図のピンに相当するオブジェクトは仕様上存在しません。
Identifiable プロトコルを継承した位置情報を持つオブジェクトを作成して利用してください。

// ピンに利用する構造体の例
struct Item: Identifiable {
    var id = UUID()
    var coordinate: CLLocationCoordinate2D
}

練習問題7-10 回答

地図はプレビュー画面に対応していないので、表示の確認は毎回シミュレーターを起動して行ってください。

練習問題7-11 回答

アラートに相当するオブジェクトは仕様上存在しません。
Viewプロトコルを継承した構造体に共通して利用できるメソッドで、アラートを表示できます。
メソッドの実行は、メソッドの引数に指定するBool型のバインディング変数の値が true になったときです。

UIオブジェクト
.alert(アラートのタイトル, isPresented: Bool型のバインディング変数, actions: { アラートのボタン配置などの処理 }, message { メッセージのテキスト } )

練習問題7-12 回答

アラート内のボタンを押した時の処理は、アラートに配置するボタンの引数 action のブロックで指定します。

UIオブジェクト
.alert(アラートのタイトル, isPresented: Bool型のバインディング変数, 
      actions: { 
               // アラートのボタン配置などの処理 
                Button( "ボタンのキャプション",  acton: {  // ボタンを押した時の処理  } )
                Button( "ボタンのキャプション",  acton: {  // ボタンを押した時の処理  } )
      },
       message { メッセージのテキスト } 
)

練習問題8-1 回答

Web API とはインターネットを通してWebサービスやデータを利用できる仕組みのことです。
Web API を利用すると、アプリの中からWebサービスを利用できるというSwiftが持つ機能以外のアプリを作成することができます。

練習問題8-2 回答

Web API で最もよく利用されるデータの形式はJSONです。

練習問題8-3 回答

Web API で取得できたJSONは文字列(テキスト)データです。
この文字列データをJSONの書式に従ってオブジェクトとして取り出す処理を行います。

練習問題8-4 回答

オプショナルとは「存在しないかもしれない」というオブジェクトの状態です。
プログラムが存在しない変数を参照するなどしてエラーを起こすことを防ぐために設けられた仕様です。
オプショナルなオブジェクトを利用するときは、値がある場合のみ処理を行うに if let 文でオブジェクトを参照するようにします。

if let オブジェクト名 = オプショナルなオブジェクト {
    // オブジェクトへの処理
}

練習問題8-5 回答

UIに関係ない処理はTaskブロックで囲います。

Task {
// 処理
}

練習問題8-6 回答

エラーを起こす可能性のあるメソッドの前に「try」を記述します。またその処理を do – catch 文で囲います。
なお「try」をつけて記述できるメソッドは、「throws」とともに宣言されているメソッドに限定されます。

do {
// エラを起こす可能性のある処理
        try メソッド
} catch {
// エラーが発生したときの処理
}

練習問題8-7 回答

do – catch 文の catch ブロックの中で 変数「error」にエラー内容が格納されます。

do {
// エラを起こす可能性のある処理
        try メソッド
} catch {
// エラーが発生したときの処理
// 変数 error でエラー内容を取得可能
}

練習問題8-8 回答

変数を「\( )」で囲うことで文字列の中に変数を埋め込むことができます。

"xxxxxx\(変数名)xxxxxx"

練習問題8-9 回答

・非同期処理:メソッドの実行と結果の取得に時間差がある処理のこと。
       メソッドの実行と結果の取得の処理を別々の箇所に定義する。
・同期処理:メソッドの実行と結果の取得を同時に行う処理のこと
      メソッドの実行と結果の取得の処理を同じ箇所に定義する。

練習問題8-10 回答

メソッドの前に「await」を記述して同期処理を行うことを明示する。
「await」を利用できるメソッドは、「async」で定義されたメソッドに限定される。

let 戻り値 = await メソッド

練習問題8-11 回答

JSONをパースするときに利用するオブジェクトには、特定のクラスや構造体はありません。
Codableプロトコルを継承した構造体を利用します。
構造体はJSONの構造にしたがって定義してください。

struct: Codabale {
    // JSONに応じたプロパティ
}

練習問題8-12 回答

JSONをパースする構造体を適切に定義していれば、階層はいくつあっても処理は変わりません。

練習問題9-1 回答

クラスとは、オブジェクトを管理するためのプログラムのことです。オブジェクトの設計図と考えるとわかりやすいです。

練習問題9-2 回答

クラスの構成要素
・プロパティ オブジェクトの性質を管理する変数
・メソッド  オブジェクトを操作する処理

練習問題9-3 回答

init メソッドはクラスからインスタンスを生成するときに自動的に実行されるメソッドです。
プログラムで init メソッドを定義する時は、「func」は書く必要のない特別なメソッドです。
init メソッドの中でプロパティの初期値を設定することが多いです。
init メソッドを利用するときの書式は次のとおりです。

let インスタンス名 = クラス名( [init メソッドの引数] )

練習問題9-4 回答

次の書式でプロパティにアクセスできます。

インスタンス名.プロパティ名

練習問題9-5 回答

次の書式でメソッドを実行できます。
引数やラベルの記述はメソッドが定義された時の書式に従ってください。

インスタンス名.メソッド名([引数])

練習問題9-6 回答

Xcodeのメニューバーから「File」>「New」>「File」からSwiftのクラス用のファイルを作成します。その後、そのファイルを編集してクラスを定義します。

練習問題9-7 回答

クラスや構造体が定義されていれば、別のファイルでも既存のファイルでも機能上の違いはありません。
作成したプログラムを管理する上で、別ファイルに分けた方がいいと思う場合は分けてください。

練習問題9-8 回答

メソッドは処理を汎用化する、コードを再利用できる、という点で定義してください。
処理に影響のある変数は引数にする、共通して使う変数は定数として定義する、など
メソッド自体は処理のみを記述するようにしてください。

練習問題9-9 回答

インスタンスを生成後に、再度 init メソッドを実行してインスタンスを再作成しない、ということであれば定数として let で宣言してください。
何度もインスタンスを再作成するという場合は変数として var で宣言します。

練習問題9-10 回答

生成後のインスタンスでどのような処理を行っても、インスタンス自体に変更がないなら定数としての宣言が正しいです。
プロパティはオブジェクトの属性、メソッドはオブジェクトの動作と考えれば、インスタンス自体に影響があるものではないので、インスタンスは定数として扱うことができます。

練習問題9-11 回答

同一プロジェクト内であればとくに必要な処理はありません。import 文も書く必要はなく、コード内ですぐにクラスを利用できます。

練習問題9-12 回答

必要な箇所でインスタンスを生成し、メソッドを実行することができます。
Swiftではクラスをプログラムの任意の箇所で利用できます。
ただし、何度も同じインスタンス生成の処理を書くのはコードの管理上いいとは言えません。ContentViewブロックの最初でインスタンスを作成し、必要な箇所ではそのインスタンスのメソッドを呼び出すだけにしておく方がコードの管理上適切です。

タイトルとURLをコピーしました