🌟

Swiftの疑問点をClaudeに聞いてみた

2023/08/21に公開

はじめに

私は最近、Swiftを用いたiOSアプリ開発に興味を持ち自学自習を開始したところです。基礎文法を学習する中で、意味の掴みにくい記法に遭遇することがしばしばあります。

そこで今回は、自分の理解が不十分な部分について人工知能のClaudeに質問し、わかりやすい説明をしてもらうことで理解を深めたいと考えました。

以下に、私が疑問に思った部分とClaudeの回答を示します。

とりあえずコード全文

【Xcode14/Swift5】SwiftUIで始めるiPhoneアプリ開発入門講座: 簡単なアプリを作りながらSwiftUIに慣れようより

dice.swift
import SwiftUI

struct ContentView: View {
 @State private var randomNumber = 1
 @State private var timer: Timer?
 @State private var isRollong = false
 
 var body: some View {
  VStack {
   Spacer()
   Image(systemName: "die.face.\(randomNumber)")
    .resizable()
    .scaledToFit()
    .frame(width: UIScreen.main.bounds.width/2)
    .padding()
   Spacer()
   Button{
    playDice()
    
   } label: {
    Text("サイコロを振る")
     .padding()
     .background(.orange)
     .foregroundColor(.black)
     .cornerRadius(10)
   }.disabled(isRollong)
   Spacer()
  }
  .padding()
 }
 private func playDice(){
  print("ボタンが押されたよ")
  isRollong = true
  timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true){_ in
   randomNumber = Int.random(in: 1...6)}
  DispatchQueue.main.asyncAfter(deadline: .now() + 0.5){
   timer?.invalidate()
   timer = nil
   isRollong = false
  }
  
 }
}

struct ContentView_Previews: PreviewProvider {
 static var previews: some View {
  ContentView()
 }
}

疑問に思ったこと

先生の回答

@State private var timer: Timer?について

Swiftでオプショナル型と呼ばれる型があり、それは値がnil (存在しない) でも許容されることを表します。

このコードでtimerがOptional型で宣言されているのは、初期状態ではtimerには値がセットされておらず、nilになっている可能性があるためです。

つまりTimer?とすることで、timerがnilでも許容されるということを明示しています。

したがって、このtimer変数を使用する際には、nilチェックを行う必要があります。

if let timer = timer {
 // timerがnilではない場合の処理 
} else {
 // timerがnilの場合の処理
}

このようにOptional型を使用することで、変数が存在しない状態を明確に表現でき、安全に値の存在を確認しな>がらコードを書くことができます。

なるほど🧐、?によってnilを許容する意味を表現していると捉えればよいか!Optional型の特徴を理解する上で役立ちそうです。

timer?.invalidate()について

timer?.invalidate()? はOptional Chainingと呼ばれる機能です。

これはOptionalな変数やプロパティに対してメソッド等を呼び出す時に、nilチェックとメソッド呼び出しを一度に行える syntatic sugar のような機能です。

このコードではtimerがOptionalなので、直接invalidate()を呼び出すとエラーになります。

そこで ? をつけることで、タイマーがnilの場合はinvalidate()を呼び出さずに安全に処理をスキップできます。

つまり以下のような処理が行われているのと同じです。

if let t = timer {
 t.invalidate() 
}

Optional ChainingはOptionalな値を扱う際に便利な機能なので、記法に慣れることがSwiftを扱う上で重要だと思います。

まとめると:

  • ? はOptionalな値であることを表す
  • ?. はOptional Chainingを利用してOptionalな値のメソッド等を呼び出す

という意味になります。

な、なるほど🧐!!
Optional Chainingはとても使い勝手が良さそうですね。記法の意味を正しく理解できたと思います。

感想

以上のように、基礎的な疑問をClaudeにぶつけることで、的確な回答を得ることができました。
人工知能を上手く利用することで、学習効率を大きく向上できそうです。

今後ともより深い理解を得るべく、疑問を持ち続け質問していきたいと思います。

参考

Discussion