標準関数
✅ 指定した文字で分割する(components)
特徴: [String]の配列を返す。空の要素も保持される。
例: "a,b,,c,".components(separatedBy: ",") → ["a", "b", "", "c", ""](空要素もそのまま)
用途: 元の文字列の構造を保ちたい場合、特にインデックスが重要な場合。
|
1 2 3 4 5 6 7 |
let text = "Wakkanai,稚内" let parts = text.components(separatedBy: ",") if parts.count == 2 { let before = parts[0] // "Wakkanai" let after = parts[1] // "稚内" print(before, after) } |
👉 String を配列に分けて取り出すイメージ。
✅ 指定した文字で分割して配列にする(split)
- 特徴:
Substringの配列を返す。空の要素は削除される。 - 例:
"a,b,,c,".split(separator: ",")→["a", "b", "c"](末尾の空、連続する空が除去) - 用途: フィルタリングされた結果を得たい場合、
mapやfilterと組み合わせやすい。
|
1 2 3 4 5 6 |
let text = "Wakkanai,稚内" let parts = text.split(separator: ",") if let before = parts.first, let after = parts.last { print(before) // "Wakkanai" print(after) // "稚内" } |
👉 split は Substring を返すので、必要なら String(before) に変換して使います。
✅ インデックスを使って抽出する(firstIndex)
Swift には直接 InStr はありませんが、firstIndex(of:) で特定の文字の位置を探せます。
|
1 2 3 4 5 6 7 8 9 10 |
let text = "Wakkanai,稚内" // カンマの位置を探す if let commaIndex = text.firstIndex(of: ",") { let before = String(text[..<commaIndex]) // 先頭からカンマの前まで let after = String(text[text.index(after: commaIndex)...]) // カンマの後ろから最後まで print(before) // "Wakkanai" print(after) // "稚内" } |
👉 これは VBA の InStr → Mid$ に近い発想です。
✅ 配列内の要素を連結する(joined)
Swiftの String.joined()メソッドは、文字列の配列([String])を、指定した区切り文字(separator)を使って一つの文字列に結合(連結)するための非常に便利な機能で、元の配列には影響を与えず、結合された新しい文字列を返します。例えば、["apple", "banana", "cherry"]という配列をカンマ区切りで結合するなら array.joined(separator: ",") で "apple,banana,cherry" が得られます。
joined(): 区切り文字なしで単純に連結します。
|
1 2 3 |
let words = ["Hello", "World"] let combined = words.joined() // "HelloWorld" print(combined) |
joined(separator:): 指定した文字列を区切り文字として使います。
|
1 2 3 |
let fruits = ["りんご", "みかん", "ぶどう"] let joinedFruits = fruits.joined(separator: "・") // "りんご・みかん・ぶどう" print(joinedFruits) |
ポイント
- 戻り値: 結合された新しい文字列が返されます。元の配列は変更されません。
- 型:
String型の配列([String])に対して使用します。 - **map()との組み合わせ**: 配列の各要素を変換してから結合したい場合にmap()`と組み合わせると強力です。
|
1 2 3 4 |
let numbers = [1, 2, 3, 4, 5] let joinedNumbers = numbers.map { "No.\($0)" }.joined(separator: ", ") // "No.1, No.2, No.3, No.4, No.5" print(joinedNumbers) |
✅ 文字列を全て小文字にする(lowercased)
|
1 2 3 |
let originalString = "i love swift!" let upperString = originalString.uppercased() print(upperString) // "I LOVE SWIFT!" と出力される |
全角文字への対応
半角だけでなく、全角の英大文字・小文字も正しく変換されます
|
1 2 |
let zenkakuString = "こんにちはSwift" print(zenkakuString.uppercased()) // "こんにちはSWIFT" |
✅文字列を全て大文字にする(uppercased)
|
1 2 |
let message = "HELLO WORLD" print(message.lowercased()) // "hello world" と出力される |
文字列が特定の接頭辞(プレフィックス)で始まっているかどうかをブール値 (true/false) で返す(hasPrefix())
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
import SwiftUI struct WeatherView: View { let weatherCondition1 = "くもりのち晴れ" let weatherCondition2 = "晴れときどきくもり" let weatherCondition3 = "雨" var body: some View { VStack(spacing: 20) { // 例 1 weatherText(condition: weatherCondition1) // 例 2 weatherText(condition: weatherCondition2) // 例 3 weatherText(condition: weatherCondition3) } } // 天気に基づいて表示を分けるヘルパービュー @ViewBuilder func weatherText(condition: String) -> some View { HStack { Text("天気: \(condition)") .frame(width: 150, alignment: .leading) // MARK: - ここで hasPrefix() を使用 if condition.hasPrefix("くもり") { Text("アイコン: ☁️") .foregroundColor(.gray) } else if condition.hasPrefix("晴れ") { Text("アイコン: ☀️") .foregroundColor(.orange) } else { Text("アイコン: -") .foregroundColor(.blue) } } } } // プレビュー #Preview { WeatherView() } |
解説
hasPrefix(_:)の利用if condition.hasPrefix("くもり")の部分では、変数conditionに格納されている文字列が**「くもり」で始まっている**かどうかを判定しています。- 例:
"くもりのち晴れ"→true - 例:
"晴れときどきくもり"→false
- 例:
- 同様に、
else if condition.hasPrefix("晴れ")で**「晴れ」で始まっている**かどうかを判定しています。
@ViewBuilderの活用- ここでは、条件分岐のロジックを**
weatherText(condition:)**というヘルパー関数に分離しています。@ViewBuilderアトリビュートを付けることで、この関数がViewを返すことを宣言し、if/elseによる条件分岐を自然に記述できるようにしています。
- ここでは、条件分岐のロジックを**
- より複雑な処理(もし必要なら)
- 特定の文字で文字列を分割したい場合は、**
split(separator:)**を使います。
- 特定の文字で文字列を分割したい場合は、**
|
1 2 3 4 5 |
let parts = "くもりのち晴れ".split(separator: "のち") // parts は ["くもり", "晴れ"] の String.SubSequence の配列になります if parts.first == "くもり" { // ... 処理 } |
ただし、最初の文字の判定だけであれば、hasPrefix() が最も直感的でパフォーマンスも優れています。
文字列、参照系
特定の文字列や値があるかどうか(contains)
contains()メソッドは、文字列や配列、Set(集合)などのコレクション型に、指定した要素(文字や値)が含まれているかどうかを判定する便利なメソッドです。含まれていればtrue、含まれていなければfalseを返します。主にコレクション内の高速な存在チェック(Setでは特に高速)や、文字列内の部分文字列の有無を確認する際に使われます
使い方
1. 文字列(String)の場合
特定の文字列(部分文字列)が含まれるかを確認します。
|
1 2 3 4 5 6 |
let message = "Hello, Swift!" if message.contains("Swift") { print("Swiftが含まれています") // こちらが出力される } else { print("含まれていません") } |
2. 配列(Array)やSet(集合)の場合
特定の要素がコレクション内に存在するかを確認します。
|
1 2 3 4 5 6 7 8 9 |
let numbers = [1, 2, 3, 4, 5] if numbers.contains(3) { print("3が含まれています") // こちらが出力される } let uniqueNumbers: Set = [10, 20, 30] if uniqueNumbers.contains(20) { print("20が含まれています") // こちらが出力される } |
主な特徴
- 戻り値:
Bool型(trueまたはfalse)。 - 高速性:
Setでは内部的にハッシュテーブルを使用しているため、要素の存在確認が非常に高速(平均O(1))です。 - 汎用性:
String,Array,Setなど、Sequenceプロトコルに準拠した様々なコレクション型で利用できます。
contains()メソッドは、コードを簡潔にし、要素の有無を直感的にチェックできるため、Swiftプログラミングで頻繁に利用されます
正規表現
✅ 基本:マッチするか調べる
|
1 2 3 4 5 |
let text = "Wakkanai,稚内" if text.contains(/稚内/) { print("稚内が含まれてる!") } |
👉 /pattern/ という書き方で、文字列にそのパターンがあるかどうか確認できます。
✅ グループで抽出する
例えば「英語名,日本語名」の形式から2つに分けたいとき:
|
1 2 3 4 5 6 7 |
let text = "Wakkanai,稚内" if let match = try? /(.+),(.+)/.firstMatch(in: text) { let english = String(match.1) // "Wakkanai" let japanese = String(match.2) // "稚内" print(english, japanese) } |
・(.+) → 1つ目のグループ(カンマ前)・(.+) → 2つ目のグループ(カンマ後)
・match.1, match.2 で取り出せます
✅ ちょっとしたパターン例
/\d+/→ 数字だけ取り出す/[A-Za-z]+/→ 英字だけ取り出す/^W.+i$/→ Wで始まり iで終わる文字列
✅ 旧来の NSRegularExpression もある
昔からある API もまだ使えます。
ただし、SwiftUI コードでサクッとやるなら新しい /正規表現/ リテラルの方が直感的でオススメです。
🎯 まとめると:
- Swift 5.7+ なら
/pattern/記法でシンプルに書ける firstMatchを使うとグループにアクセスできる- VBA よりもはるかに強力で安全(型付きの結果が返る)

コメント