tac-tac-go
← Posts

swift備考録


2026-06-11

文字列の両端を除いたものを出力したいとき

dropFirstdropLast を使う

参考例

func removeFirstAndLast(_ str: String) -> String {
  String(str.dropFirst().dropLast())
}

2026-05-26

文字列を繰り返したい時

JavaScriptだとrepeatという関数を用いて文字列を繰り返すがSwiftだと引数ラベルを指定する。Swiftは何かを生成するタイミングで処理を行うときは引数ラベルで処理を記述することが多い。ただし uppercased() のようにすでに何かあるものに対して処理を行うのであれば関数を記述する。

参考例

func repeatStr(_ n: Int, _ string: String) -> String {
  String(repeating:string,count:n)
}

2026-05-24

配列で先頭からN個の要素を取得したいとき

参考例

func take(_ arr: [Int], _ n: Int) -> [Int] {
  return Array(arr.prefix(n))
}

prefix を使う。指定した個数分の先頭部分の部分配列を返す。 対象的に、suffix は指定した個数分の末尾部分の部分配列を返す


2026-05-23

Swiftで文字列の長さを数える時

countを使う。なお、Arrayに対しても同様に要素数を数えるにはcountを使う


2026-05-21

Swiftで配列の中に要素が含まれているかを確認

参考例

func check<T: Equatable>(_ a: [T], _ x: T) -> Bool {
    return a.contains(x)
}

contains を使う。Javascript なら includes なのでそこの違いは覚える。


2026-05-20

Swiftでワンライナーの実装例

参考例

func multi_table(_ number: Int) -> String{(1...10).map { "\($0) * \(number) = \($0 * number)" }.joined(separator: "\n")}

今回の実装例は5の位の掛け算をおこなう式を列挙するものであるが、for でループを回さなくても(1...指定した範囲) で繰り返し処理をおこなう配列を作ることができ、その値を使ってその配列をjoin する。そして値を明示的に返すString としてreturn する。


2026-05-19

Swiftの演算子とスペースのルール

言語if bmi <= 18.5 (両方空ける)if bmi<=18.5 (両方詰める)if bmi <=18.5 (左だけ空ける)
JavaScript◯ 動く◯ 動く◯ 動く
Python◯ 動く◯ 動く◯ 動く
Go◯ 動く◯ 動く◯ 動く
Swift◯ 動く(推奨)◯ 動く(非推奨)✕ エラーになる

2026-05-17

文字列から配列への変換について

参考例

func digitize(_ num:Int) -> [Int] {
  String(num).reversed().map {Int(String($0))!}
}

上記のコードは与えられた整数を反転して配列にする実装である。 まずreversed するために文字列に変換する。そしてJavascriptとの違いとして文字列を配列に変換する必要がSwiftはない。Javascriptならsplitやスプレッド変換をしてからmapするが、Swiftは標準で文字の配列として扱える仕組みになっているので、mapを使った時点で1文字ずつ取り出せる。Int(String($0))!! は 強制アンラップでnil になるのを防ぐための実装である。


2026-05-16

外部引数と内部引数について

参考例

func quarter(of month: Int) -> Int {
  if month >= 1 && month <= 3 { return 1 }
  if month >= 4 && month <= 6 { return 2 }
  if month >= 7 && month <= 9 { return 3 }
  return 4
}

of(外部引数名): 関数の「外側」で、呼び出すときに使う名前 month(内部引数名): 関数の「内側」で、処理(コード)に使う変数名

使わなくても問題はないが英文として綺麗に読ませることができるのであっても便利。 あと外部引数は意味のある単語にして、内部引数で省略した形を使うのもあり


2026-05-13

in の使い方について

クロージャーのなかで inを使い要素を一つずつ取り出すということができる

参考例

func fakeBin(digits: String) -> String {
  let result = digits.map { char in
      (Int(String(char)) ?? 0) < 5 ? "0" : "1"
  }.joined()
  return result
}

「5未満の数字を '0' に、5以上の数字を '1' に置き換えて、新しい文字列を作る」 という実装。

char inを「char という名前で取り出して、これ以降(in の後)で使えるようにする nil などは出てきた実装ではある。 一つ知識として ed のように過去分詞を使う場面があるあ、主にメソッドの命名において、状態が変更されない(Nonmutating)メソッドや、副作用のないメソッドの名前に用いられる。 なので、他の言語だと join だけで終わるような記述もあるが、過去分詞を使うように意識する。


2026-05-12

compactMapについて

compactMapとは、「配列の要素を変換し、その過程で発生した nil を自動的に取り除いてくれる」非常に便利な関数

参考例

func sumMix(_ arr: [Any]) -> Int {
  return arr.compactMap { Int(String(describing: $0)) }.reduce(0, +)
}

この実装としては 「数値と文字列が混ざった配列から、数字として読み取れるものだけを全て合計する」というもの。String で一度文字列に全てを変換するが、その後数値以外はInt に変換できないので nilとなり、除去される。それをreduceで足し算とする。


2026-05-11

nil合体演算子

Swiftの nil は、JavaScriptにおける nullundefined の両方の役割を一人でこなしているようなイメージ。0や空文字などでは右側の値を使うとはならない。nilはnullよりも厳格。

参考例

func sum_str(_ a: String, _ b: String) -> String {
  String((Int(a) ?? 0) + (Int(b) ?? 0))
}

このコードでなぜ ?? が渡されているかというと もし 引数に hello などが渡されるとそれは数値に変換できないため、数値にできないなら、数値型のデータ(箱)を渡すことすらできないと判断されるので右側に保険をかける意味で実装が必要


2026-05-10

配列を作成するいくつかの実装

Swiftで配列を作成する方法はいくつかあるが、馴染みのない書き方を紹介

参考例1(引数ラベルを使う方法)

// 0で初期化された100個のInt配列
let hundredZeros = Array(repeating: 0, count: 100)
// ["A", "A", ... , "A"] (100個)
let hundredAs = Array(repeating: "A", count: 100)

Swiftは「コードを読んだだけで何をしているかを明確にすること」がとても重要視された言語である。なので引数ラベルを記述することが基本である。

参考例2(範囲演算子)

// 0, 1, 2, ..., 99 の100個
let zeroTo99 = (0..<100).map { $0 }

// 結果: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let numbers = Array(1...10) 

...を使うと範囲演算子でその範囲を指定することができ、for などでも活用される。mapを使うこともできるし、Arrayでラップしてもいい。


2026-05-09

文字列を大文字、小文字にする実装

uppercaseduppercasedを使い大文字小文字にする

let text = "Hello, Swift"

// すべて大文字にする
let upper = text.uppercased() 
// 結果: "HELLO, SWIFT"

// すべて小文字にする
let lower = text.lowercased() 
// 結果: "hello, swift"

2026-05-08

テンプレートリテラル(文字列補完)を実現するとき

Swiftには、JavaScriptなどの「テンプレートリテラル」とほぼ同じ機能として、「文字列補完」という仕様がある。\でエスケープして()で変数名で囲むことで変数名を文字列に埋め込むことができる

参考例

func greet(_ name: String) -> String {
  "Hello, \(name) how are you doing today?"
}

2026-05-07

各配列の要素に対して累乗を行いたい時

mapのなかで最初の引数は$0という名前で呼ぶことができ、map に関しては各要素の値に対応するためそれらを掛け合わせれば累乗になる。

参考例

func squareSum(_ vals: [Int]) -> Int {
  return vals.map { $0 * $0 }.reduce(0,+)
}

2026-05-06

filterを行いたい時

この実装はfilterで正の値を絞り込みそれらの値を足し算する実装である。 クロージャ式 は{}で括られる匿名関数のようなものでこの中に処理を記述していくが、関数に渡されるのが クロージャ式のみの場合 ()を省略できるようになっている。またreduceを使いたい場合、第一引数に初期状態を記述し、第二引数に何をしたいのかを記述する。Javascriptではこれが逆のため、少し混乱を招きやすい。

参考例

func sumOfPositives (_ numbers: [Int] ) -> Int {
    numbers.filter{$0 >= 0}.reduce(0,+)
}

2026-05-05

配列を逆にするには

reversed を使う

参考例

func reverseSeq(n: Int) -> [Int] {
  return Array((1...n).reversed())
}