Swiftのプログラミングにおいて、ループと条件分岐を組み合わせることで、効率的で柔軟な処理を実現することができます。これにより、反復的な処理や複雑なロジックを簡潔に実装でき、特にデータのフィルタリングや繰り返し処理において効果的です。本記事では、Swiftの基本的なループ構造と条件分岐を組み合わせた実装方法を解説し、実践的な例や応用例を通じて、柔軟なプログラムの作成方法を学んでいきます。これにより、より高度でパフォーマンスの高いコードを書くためのスキルを身につけることができるでしょう。
Swiftの基本的なループ構造
Swiftには複数のループ構造が用意されており、反復処理を簡単に行うことができます。ここでは、代表的なループであるfor
、while
、repeat-while
の3種類を紹介します。
for-inループ
for-in
ループは、コレクション内の要素を順に処理する際に最もよく使用されます。例えば、配列や範囲(Range)の各要素に対して繰り返し処理を行うことができます。
let numbers = [1, 2, 3, 4, 5]
for number in numbers {
print(number)
}
whileループ
while
ループは、条件がtrue
の間、繰り返し処理を行います。条件が最初からfalse
である場合、一度もループが実行されません。
var counter = 0
while counter < 5 {
print(counter)
counter += 1
}
repeat-whileループ
repeat-while
ループは、少なくとも1回はループ処理が実行される点が特徴です。条件のチェックは処理の最後に行われます。
var counter = 0
repeat {
print(counter)
counter += 1
} while counter < 5
これらのループ構造は、シンプルな繰り返し処理や、配列や辞書といったコレクションのデータを効率的に処理する際に便利です。
条件分岐の基本構造
条件分岐は、プログラムの実行フローを制御するために重要な要素です。Swiftでは、if
文やswitch
文を用いて、特定の条件に基づいた処理を簡単に実装できます。ここでは、それぞれの基本的な使い方を紹介します。
if文
if
文は、条件がtrue
であればブロック内のコードが実行され、false
であれば次のelse
文に移行します。最も基本的な条件分岐の方法です。
let score = 85
if score >= 90 {
print("Excellent")
} else if score >= 75 {
print("Good")
} else {
print("Needs Improvement")
}
この例では、score
の値に応じて異なるメッセージを表示します。if-else if-else
の構造を用いることで、複数の条件を扱うことが可能です。
switch文
switch
文は、複数のケースに基づいて条件分岐を行う際に便利です。特に、複数の値を簡潔にチェックする必要がある場合に効果的です。switch
文はすべてのケースを網羅する必要があり、網羅されない場合はdefault
ケースを追加する必要があります。
let day = "Monday"
switch day {
case "Monday", "Tuesday", "Wednesday", "Thursday", "Friday":
print("Weekday")
case "Saturday", "Sunday":
print("Weekend")
default:
print("Invalid day")
}
この例では、day
の値に応じて「平日」か「週末」かを判断し、適切なメッセージを出力します。
条件分岐は、プログラムのロジックを動的に制御するための重要な手段であり、状況に応じてif
文とswitch
文を使い分けることがポイントです。
ループ内で条件分岐を活用する
ループ処理の中で条件分岐を使用することで、より柔軟で効率的な処理が可能になります。特定の条件に基づいてループ内の処理を変更することで、無駄な計算を避けたり、異なるロジックを実装したりできます。ここでは、ループと条件分岐を組み合わせた具体的な例を見ていきます。
for-inループ内でのif文の活用
for-in
ループの中でif
文を使用し、特定の条件に基づいて異なる処理を行うことができます。例えば、偶数と奇数に応じて異なるアクションを実行する場合です。
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for number in numbers {
if number % 2 == 0 {
print("\(number) is even")
} else {
print("\(number) is odd")
}
}
この例では、ループ内で偶数か奇数かを判定し、それに応じてメッセージを表示しています。このように、ループ内で条件分岐を活用することで、柔軟に処理を変えることができます。
whileループ内での条件分岐
while
ループでも同様に、条件に応じた分岐を行うことが可能です。例えば、特定の条件が満たされるまでループを続けるといったケースです。
var count = 0
while count < 10 {
if count % 3 == 0 && count != 0 {
print("\(count) is divisible by 3")
}
count += 1
}
この例では、count
が3の倍数であり、かつ0ではない場合にメッセージを表示します。条件分岐を使うことで、特定の数値や状態に対する処理を効率的に行うことができます。
switch文を使ったループ内の条件分岐
switch
文をループ内で使うことも可能です。複数の条件を整理して記述でき、特定のパターンに基づいて処理を分岐させる場合に便利です。
let scores = [55, 72, 90, 33, 85]
for score in scores {
switch score {
case 90...100:
print("Excellent")
case 75..<90:
print("Good")
case 50..<75:
print("Pass")
default:
print("Fail")
}
}
この例では、スコアに応じて「Excellent」から「Fail」までのメッセージを切り替えています。switch
文を用いることで、複数の範囲やパターンを簡潔に処理することができます。
ループ内で条件分岐を活用することで、複雑な処理フローもシンプルかつ読みやすく整理することができるため、プログラムの保守性が向上します。
breakとcontinueの活用方法
Swiftのループでは、break
やcontinue
を使うことで、ループの流れを制御することができます。これらを活用することで、特定の条件に基づいてループを途中で終了させたり、次の反復処理にスキップしたりすることが可能です。効率的な処理や不要な計算を避けるために、これらの機能は非常に役立ちます。
breakの使い方
break
は、ループの処理を途中で強制的に終了するために使用されます。ある条件が満たされた場合にループ全体を終了させる際に便利です。
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for number in numbers {
if number == 5 {
print("Number 5 found, stopping the loop.")
break
}
print("Processing number \(number)")
}
この例では、number
が5になった時点でbreak
が実行され、ループが終了します。break
を使うことで、条件を満たした際に無駄な反復を防ぐことができます。
continueの使い方
continue
は、現在の反復処理をスキップして次の反復に移るために使用されます。条件が満たされた場合に、その特定の反復だけを無視したい場合に有効です。
for number in numbers {
if number % 2 != 0 {
continue // 奇数の場合はスキップ
}
print("\(number) is even")
}
この例では、奇数が検出されるたびにcontinue
が実行され、奇数の処理をスキップして次の偶数に進みます。これにより、必要な処理だけを行い、不要な処理を避けることができます。
breakとcontinueの使い分け
break
とcontinue
は、それぞれ異なる役割を持っています。break
はループ全体を終了するのに対し、continue
は現在のループ反復のみをスキップします。これらを適切に使い分けることで、無駄な処理を減らし、パフォーマンスを向上させることができます。
たとえば、大規模なデータセットを処理する場合、特定の条件に基づいて早期にループを終了するか、一部のデータ処理をスキップするかを決定できます。これにより、効率的でスムーズなプログラムを実装できます。
複数条件を使用した高度な分岐
Swiftでは、複数の条件を組み合わせて複雑な条件分岐を実装することができます。&&
(論理AND)や||
(論理OR)を使用することで、同時に複数の条件をチェックし、より柔軟な処理を行うことが可能です。ここでは、複数条件を使った条件分岐の具体例とその活用法を紹介します。
論理AND(&&)を使った条件分岐
論理AND演算子&&
を使うことで、すべての条件がtrue
である場合にのみ処理を実行することができます。以下の例では、数値が偶数でかつ5より大きい場合のみ、メッセージを表示します。
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for number in numbers {
if number % 2 == 0 && number > 5 {
print("\(number) is even and greater than 5")
}
}
この例では、number
が偶数で、かつ5より大きい場合に条件を満たし、メッセージが表示されます。&&
を使うことで、複数の条件を同時にチェックできます。
論理OR(||)を使った条件分岐
論理OR演算子||
を使うと、いずれかの条件がtrue
であれば処理が実行されます。以下の例では、数値が偶数または10以上の場合にメッセージを表示します。
for number in numbers {
if number % 2 == 0 || number >= 10 {
print("\(number) is either even or greater than or equal to 10")
}
}
この例では、number
が偶数であるか、または10以上である場合にメッセージが表示されます。||
を使うことで、どちらか一方の条件を満たせば処理が実行されるように制御できます。
複数条件をネストして使う
複雑な条件分岐が必要な場合、if
文やswitch
文の中にさらに条件をネストして使うことができます。これにより、複雑なロジックを扱うことが可能です。
for number in numbers {
if number % 2 == 0 {
if number > 8 {
print("\(number) is even and greater than 8")
} else {
print("\(number) is even and 8 or less")
}
} else {
print("\(number) is odd")
}
}
この例では、まずnumber
が偶数かどうかをチェックし、その後にさらに条件を分けて処理を行っています。ネストを使うことで、段階的に複雑な条件を適用できます。
複数条件を適切に使うことで、効率的かつ高度な条件分岐を実現でき、特に複雑なロジックやデータ処理の場面で有用です。
ネストされたループと条件分岐
ネストされたループと条件分岐を組み合わせることで、さらに複雑な処理を実装することができます。特に多次元データや複数の配列を扱う場合に有効です。ここでは、ループ内に別のループや条件分岐をネストして使用する例を紹介します。
ネストされたforループ
ネストされたfor
ループは、二次元配列や行列のデータを扱う際に使用されます。以下の例では、二次元配列をループ処理して各要素を表示します。
let matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
for row in matrix {
for value in row {
print(value, terminator: " ")
}
print("") // 改行
}
この例では、外側のループで各行(配列)を処理し、内側のループでその行内の各要素を処理しています。これにより、行列のような多次元データを扱う際に便利です。
ネストされた条件分岐とループの組み合わせ
ループ内に条件分岐をネストすることで、さらに柔軟な処理を実現できます。例えば、条件に応じて異なる処理を行いたい場合に役立ちます。
let data = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
for row in data {
for value in row {
if value % 2 == 0 {
print("\(value) is even")
} else {
print("\(value) is odd")
}
}
}
この例では、各要素に対して偶数か奇数かを判断し、その結果に基づいて異なるメッセージを表示します。ネストされた条件分岐を使うことで、特定の条件に応じた複雑な処理を実装できます。
breakとcontinueを使ったネストされたループの制御
ネストされたループでbreak
やcontinue
を使用すると、特定の条件に応じて内側または外側のループを制御することができます。以下の例では、内側のループで特定の条件を満たした場合に処理をスキップします。
for row in matrix {
for value in row {
if value == 5 {
print("Skipping value 5")
continue
}
print(value)
}
}
この例では、value
が5の場合にその処理をスキップし、他の要素に対する処理を続けます。ネストされたループにおいて、break
やcontinue
を使うことで柔軟に処理フローを制御できます。
ネストされたループと条件分岐は、複数の条件を考慮しながら、効率的な処理を実現する際に非常に役立ちます。データの階層構造や多次元データを扱う際に特に強力なツールとなります。
パフォーマンスを考慮したループと条件分岐
ループや条件分岐はプログラムの柔軟性を高める一方で、パフォーマンスにも影響を与える可能性があります。特に、大規模なデータセットを処理する場合、適切な最適化を行わないと、処理が遅くなることがあります。ここでは、Swiftにおいてループと条件分岐のパフォーマンスを最適化するための方法と注意点を解説します。
不必要なループ回避
ループ内で無駄な処理を行うと、パフォーマンスに大きな影響を与えます。例えば、同じ計算を繰り返し行うのではなく、ループの外であらかじめ計算を行っておくことで、効率を向上させることができます。
let numbers = Array(1...1000000)
let threshold = 500000
for number in numbers {
if number > threshold {
break // 無駄なループを避けて処理を早期終了
}
print(number)
}
この例では、threshold
を超えた時点でループを終了することで、無駄な処理を防ぎ、パフォーマンスを最適化しています。
条件分岐の順序に注意する
if
文やswitch
文の条件の順序は、処理速度に影響を与えることがあります。最も頻繁に成立する条件を先に評価することで、無駄な条件チェックを減らすことができます。
for number in numbers {
if number == 1 {
// ここで条件がよく成立する場合、先に評価することで処理が早くなる
} else if number == 999999 {
// まれに成立する条件は後に
}
}
このように、処理の順序を工夫することで、パフォーマンスを改善することができます。
ループの最適化: forEachの活用
Swiftの標準ライブラリには、配列に対してforEach
を使ったループがあります。forEach
は、特定の条件でループを途中で終了することができませんが、単純なループであれば可読性が向上します。
numbers.forEach { number in
if number % 2 == 0 {
print("\(number) is even")
}
}
この例では、forEach
を使って偶数の数値を処理しています。大量のデータを処理する場合は、for-in
よりもforEach
の方が読みやすいコードになりますが、途中でループを終了する必要がある場合はfor-in
を使う方が適切です。
メモリ効率の向上
大量のデータを処理する際には、メモリ使用量を抑えるために、コレクションのコピーを避けることが重要です。たとえば、Array
を処理する際には、必要に応じてlazy
を使うことで遅延評価を活用し、メモリ効率を高めることができます。
let largeNumbers = Array(1...1000000).lazy
for number in largeNumbers {
if number > 500000 {
break
}
print(number)
}
この例では、lazy
を使うことで、全要素の評価を遅らせ、必要な範囲だけを評価するため、メモリ消費を抑えることができます。
ビッグOの考慮
ループや条件分岐のパフォーマンスを最適化する際には、アルゴリズムの計算量(ビッグO記法)も重要なポイントです。例えば、ループの中でネストされたループを使うと、時間計算量がO(n^2)になり、処理速度が大幅に遅くなる可能性があります。可能な限り、時間計算量をO(n)に抑えるように意識しましょう。
適切なデータ構造の選択
処理対象のデータが大きくなるほど、適切なデータ構造の選択が重要になります。たとえば、頻繁に検索を行う場合、Array
よりもSet
やDictionary
を使う方がパフォーマンスが向上することがあります。Set
やDictionary
は、検索がO(1)で行えるため、ループ内で頻繁に検索を行う場合に有効です。
let numberSet: Set = [1, 2, 3, 4, 5]
if numberSet.contains(3) {
print("Set contains 3")
}
このように、適切なデータ構造を選ぶことで、ループや条件分岐のパフォーマンスを大幅に改善できます。
パフォーマンスを考慮してループと条件分岐を最適化することは、大規模なデータセットや計算の負荷が高い処理において非常に重要です。コードの可読性を保ちつつ、効率的な処理を目指しましょう。
実践例: フィルタリングとデータ処理
ここでは、ループと条件分岐を使用して、データをフィルタリングし処理を行う実践的な例を紹介します。特定の条件に基づいてデータを選別し、さらにそのデータに対して適切な操作を行う方法を解説します。フィルタリングは、大量のデータを処理する際に、必要なデータのみを抽出するための非常に便利な方法です。
配列のフィルタリング
まず、filter
メソッドを使って配列から特定の条件に一致する要素だけを取り出します。例えば、100以上の数値のみをフィルタリングする場合の例を見てみましょう。
let numbers = [34, 120, 150, 45, 98, 200, 101]
let filteredNumbers = numbers.filter { $0 >= 100 }
print(filteredNumbers) // [120, 150, 200, 101]
この例では、filter
メソッドを使い、数値が100以上の要素を抽出しています。このメソッドは、条件に一致する要素を簡単にフィルタリングできる強力なツールです。
フィルタリングとループ処理の組み合わせ
次に、フィルタリングされたデータに対してループ処理を行い、さらなるデータ操作を行います。たとえば、フィルタリングされた数値に対して、すべての数値を2倍にする処理を行ってみます。
for number in filteredNumbers {
let doubled = number * 2
print("\(number) doubled is \(doubled)")
}
この例では、先ほどフィルタリングされた数値に対して、各数値を2倍にし、結果を出力しています。このように、フィルタリングとループを組み合わせることで、特定の条件に基づくデータ操作が効率的に行えます。
実践例: 学生の成績フィルタリング
より実践的な例として、学生の成績データから合格者をフィルタリングし、その合格者に対して追加の処理を行うケースを考えてみます。
struct Student {
let name: String
let score: Int
}
let students = [
Student(name: "Alice", score: 95),
Student(name: "Bob", score: 82),
Student(name: "Charlie", score: 68),
Student(name: "David", score: 55)
]
let passingScore = 70
let passingStudents = students.filter { $0.score >= passingScore }
for student in passingStudents {
print("\(student.name) has passed with a score of \(student.score).")
}
この例では、Student
という構造体を使い、各学生の成績データを格納しています。filter
メソッドを使用して、合格点(70点)以上の学生をフィルタリングし、その後にループで合格者の名前と点数を表示しています。
mapを使ったデータ処理
フィルタリング後にデータを加工する際、map
メソッドを使うことで効率的に新しいデータを生成することができます。例えば、フィルタリングされた学生の点数を10点加算した新しいデータを作成します。
let boostedScores = passingStudents.map { student in
return Student(name: student.name, score: student.score + 10)
}
for student in boostedScores {
print("\(student.name)'s new score is \(student.score).")
}
この例では、map
を使って合格した学生の成績に10点を加算し、新しいStudent
オブジェクトを作成しています。map
は、データの変換や加工を効率的に行うための便利な方法です。
reduceを使った合計値の計算
最後に、reduce
メソッドを使って、フィルタリングされたデータの合計値を計算する例を紹介します。例えば、合格者の点数の合計を計算します。
let totalScore = passingStudents.reduce(0) { $0 + $1.score }
print("Total score of passing students is \(totalScore).")
この例では、reduce
メソッドを使い、合格者全員の点数の合計を計算しています。reduce
は、配列の全体を一つの値に集約するためのメソッドで、合計や平均などの計算に便利です。
実践例を通じて、フィルタリングとループ、さらにデータの加工や集約を組み合わせた高度なデータ処理方法を学びました。これらのテクニックを活用することで、大規模なデータセットや複雑な処理を効率的に行うことができます。
エラー処理とループの組み合わせ
Swiftでは、エラー処理を行いながらループを組み合わせることで、プログラムが実行中に発生する予期しない問題に対処することが可能です。特に、ループを使って外部リソースにアクセスする場合や、条件に基づいてデータを処理する際に、エラーが発生した場合でもプログラムの健全性を保ちながら処理を続行できるようになります。
do-catch構文とループの組み合わせ
Swiftのdo-catch
構文を使うことで、エラーが発生した場合でもプログラムがクラッシュせず、適切にエラーハンドリングを行うことができます。これをループ内で使用することで、各反復処理でエラーが発生しても、処理を続行するか、適切に対処することが可能です。
enum DataError: Error {
case invalidData
}
let data = ["123", "abc", "456", "xyz"]
for item in data {
do {
guard let number = Int(item) else {
throw DataError.invalidData
}
print("Processed number: \(number)")
} catch {
print("Error processing data: \(item) is not a valid number")
}
}
この例では、文字列を整数に変換する処理をループで行い、変換に失敗した場合にはエラーをキャッチして処理を続けています。do-catch
構文を使うことで、エラーが発生してもプログラム全体を停止させずに処理を続けることができます。
try? を使った簡易的なエラーハンドリング
try?
を使うと、エラーをキャッチしなくてもnil
を返すことでエラーを処理する簡易的な方法を使用できます。特定のエラーが発生した場合には、そのデータをスキップして処理を続けるような場合に有効です。
let moreData = ["12", "foo", "34", "bar"]
for item in moreData {
if let number = Int(item) {
print("Successfully processed: \(number)")
} else {
print("Failed to process: \(item)")
}
}
この例では、try?
の代わりにInt
の失敗可能な初期化子を使ってエラーを処理していますが、エラーが発生した場合はnil
を返すため、データの処理を中断せずに済みます。
エラーリカバリの実装
エラーが発生した場合に、単に処理をスキップするだけでなく、リカバリ処理を行うことも可能です。例えば、外部のAPIからデータを取得するループ処理において、通信エラーが発生した場合に再試行を行う処理を実装することができます。
enum NetworkError: Error {
case timeout
}
func fetchData() throws -> String {
// 通信処理の例
throw NetworkError.timeout
}
for _ in 1...3 {
do {
let result = try fetchData()
print("Data fetched: \(result)")
break
} catch NetworkError.timeout {
print("Timeout occurred, retrying...")
} catch {
print("Unexpected error: \(error)")
break
}
}
この例では、fetchData()
関数が通信エラーをシミュレートしています。do-catch
内でエラーが発生した場合、特定のエラーに応じて再試行するか、予期しないエラーが発生した場合は処理を中断します。このように、リカバリ処理を適切に行うことで、エラーが発生してもプログラムの安定性を保つことができます。
ループとエラー処理を組み合わせた実用例
たとえば、複数のURLからデータを取得する処理を行う際、一部のURLでエラーが発生しても他のURLのデータ取得を続行できるようにする場合があります。
let urls = ["https://validurl.com", "invalid_url", "https://anothervalidurl.com"]
for url in urls {
do {
let data = try fetchDataFromURL(url)
print("Fetched data from: \(url)")
} catch {
print("Failed to fetch data from: \(url)")
}
}
この例では、fetchDataFromURL()
関数がURLからデータを取得する処理を行い、エラーが発生した場合にはエラーメッセージを表示して処理を続けています。このように、エラー処理を組み込んだループを使うことで、安定した処理フローを構築することができます。
エラー処理とループを組み合わせることで、予期しないエラーや例外が発生しても、処理の中断を最小限に抑えつつ、適切なリカバリや対処を行うことができます。これにより、堅牢で信頼性の高いアプリケーションの開発が可能になります。
応用編: コレクション操作での柔軟な処理
Swiftのコレクション(配列、セット、辞書)は、ループと条件分岐を組み合わせることで、効率的かつ柔軟なデータ操作が可能です。コレクションを利用する場面は多岐にわたり、特にデータの操作や検索、加工を行う際に役立ちます。ここでは、配列、セット、辞書といったコレクションに対してループと条件分岐を適用した実践的な処理例を紹介します。
配列の操作
配列(Array
)は、最も一般的なコレクションの一つです。以下の例では、配列の要素をループし、特定の条件に一致するものを抽出したり、処理を施したりします。
let numbers = [1, 5, 9, 12, 18, 25, 30]
for number in numbers {
if number % 3 == 0 {
print("\(number) is divisible by 3")
} else {
print("\(number) is not divisible by 3")
}
}
この例では、配列の要素が3で割り切れるかどうかをチェックし、条件に基づいて異なるメッセージを表示しています。こうした柔軟な条件分岐により、配列の操作を効率化できます。
セットの操作
セット(Set
)は、順序を持たず、重複する要素を含まないコレクションです。データの存在確認やユニークな要素の管理に適しています。以下の例では、セット内の要素が特定の条件に一致するかどうかをループで確認します。
let uniqueNumbers: Set = [3, 6, 9, 12, 15, 18]
for number in uniqueNumbers {
if number > 10 {
print("\(number) is greater than 10")
}
}
この例では、Set
内の要素が10より大きいかどうかをチェックしています。Set
の特徴を活かすことで、高速なデータ操作が可能です。
辞書の操作
辞書(Dictionary
)はキーと値のペアでデータを管理します。ループや条件分岐を用いることで、特定の条件に一致するキーや値を抽出したり、処理を施したりすることができます。
let studentScores = [
"Alice": 85,
"Bob": 92,
"Charlie": 68,
"David": 74
]
for (name, score) in studentScores {
if score >= 75 {
print("\(name) has passed with a score of \(score).")
} else {
print("\(name) has not passed.")
}
}
この例では、各学生の成績をループで処理し、合格基準に基づいてメッセージを表示しています。辞書を使うことで、キーと値のペアを効率的に管理し、条件に基づいた処理が可能です。
複雑なコレクション操作: ネストされたデータ構造
コレクションの中にコレクションを持つようなネストされたデータ構造もよく見られます。こうした場合、ループと条件分岐を組み合わせることで、階層的なデータ操作が可能になります。
let classGrades = [
"Class A": [80, 85, 78],
"Class B": [92, 88, 91],
"Class C": [70, 75, 68]
]
for (className, grades) in classGrades {
print("Processing grades for \(className):")
for grade in grades {
if grade >= 80 {
print(" Grade \(grade): Passed")
} else {
print(" Grade \(grade): Needs Improvement")
}
}
}
この例では、各クラスの成績データを処理し、成績ごとに合格か改善が必要かを表示しています。ネストされたコレクションに対して、外側と内側のループを組み合わせて処理することができます。
高次関数を使ったコレクション操作
Swiftでは、map
やfilter
といった高次関数を使って、ループ処理や条件分岐を簡潔に書くことができます。これにより、コレクション操作をより効率的に行うことが可能です。
let grades = [65, 78, 92, 85, 47]
let passingGrades = grades.filter { $0 >= 75 }
print("Passing grades: \(passingGrades)")
この例では、filter
関数を使って、合格点以上の成績だけを抽出しています。高次関数を使うことで、可読性が高く、簡潔なコードを実現できます。
コレクション操作でループと条件分岐を組み合わせることで、より柔軟なデータ処理が可能になります。Swiftの豊富なコレクション操作機能を活用して、効率的にデータを処理しましょう。
演習問題: 自分で実装してみよう
これまで学んだループや条件分岐、コレクション操作の知識を基に、実際に自分でコードを実装してみましょう。以下の課題に取り組むことで、理解を深め、Swiftでの柔軟な処理がどのように行えるかを確認できます。
課題1: 偶数の合計を計算する
整数の配列から偶数を抽出し、その合計を計算するプログラムを作成してください。
ヒント:
- 配列の各要素をループで処理
if
文を使って偶数を判定- 偶数の合計を計算
let numbers = [3, 7, 12, 15, 18, 21, 26, 33]
var sum = 0
for number in numbers {
if number % 2 == 0 {
sum += number
}
}
print("Sum of even numbers: \(sum)")
課題2: 最高得点の学生を見つける
学生の名前と得点の辞書を使って、最高得点の学生を見つけ、その名前と得点を表示するプログラムを作成してください。
ヒント:
Dictionary
の各ペアをループで処理if
文を使って最高得点を判定
let studentScores = [
"Alice": 85,
"Bob": 92,
"Charlie": 78,
"David": 88
]
var highestScore = 0
var topStudent = ""
for (name, score) in studentScores {
if score > highestScore {
highestScore = score
topStudent = name
}
}
print("Top student is \(topStudent) with a score of \(highestScore)")
課題3: 辞書内の特定の値を持つ要素をカウント
辞書の値が特定の条件(例えば、70点以上)を満たす要素の数をカウントし、表示するプログラムを作成してください。
ヒント:
- 辞書をループ処理
- 条件分岐で特定の値を判定
- カウンターを使用して一致する要素を数える
let scores = ["Alice": 85, "Bob": 65, "Charlie": 78, "David": 92]
var count = 0
for (_, score) in scores {
if score >= 70 {
count += 1
}
}
print("Number of students scoring 70 or above: \(count)")
これらの課題を通して、ループと条件分岐をどのように活用するかを実際に体験し、スキルを磨いてください。
まとめ
本記事では、Swiftのループと条件分岐を組み合わせた柔軟な処理方法について解説しました。基本的なループ構造や条件分岐の使い方から始まり、複数条件やネストされたループの活用方法、パフォーマンスを考慮した最適化、実践的なフィルタリングやエラー処理の組み合わせまで幅広く紹介しました。これらのテクニックを駆使することで、より効率的で保守性の高いSwiftプログラムを実装できるようになるでしょう。
コメント