🌊

【DAY3】100 Days of SwiftUI -Arrays, dictionaries, sets, and enums

2022/12/29に公開

はじめに

iOSアプリ界隈で(たぶん)有名なPaul Hudsonさんが無料で公開しているSwiftUIの100日学習コースを進めてみます。学習記録及び備忘録がてらにつらつらと書いてみます。
100 Days of SwiftUI

学んだこと

序盤はSwiftUIは関係なくSwiftという言語の言語仕様のお話。気になった点だけピックアップ。

配列の宣言と追加

型を明示的に示して宣言する書き方は以下の通り。要素の追加はappend()で行える。

var scores = Array<Int>()
scores.append(100)
scores.append(80)
scores.append(85)
print(scores[1])  // 出力:80

もしくは以下のようにも書ける。

var albums = [String]()
albums.append("Folklore")
albums.append("Fearless")
albums.append("Red")
print(albums[0])  // 出力:Folklore

配列のもろもろ

要素数

countで取得可能。

var beatles = ["John", "Poul", "George", "Ringo"]
print(beatles.count)// 出力:4

要素削除

remove(at:)で任意のインデックスの要素を削除、removeAll()で全ての要素を削除。

var characters = ["Lana", "Pam", "Ray", "Sterling"]
print(characters.count)  // 出力:4

characters.remove(at: 2)
print(characters.count)  // 出力:3

characters.removeAll()
print(characters.count)  // 出力:0

配列の中に指定の値が存在するか

contains()で確認。

let bondMoviews = ["Casino Royale", "Spectre", "No Time To Die"]
print(bondMoviews.contains("Frozen"))  // 出力:false

配列の中身をソート

sorted()でソートする。アルファベット順や数字の小さい順にソートされる。

let cities = ["London", "Tokyo", "Rome", "Budapest"]
print(cities.sorted())
// 出力:["Budapest", "London", "Rome", "Tokyo"]

日本語文字列の場合、数字→アルファベット→ひらがな→カタカナ→漢字の順にソートされる様子。

let cities = ["ロンドン", "東京", "ろーま", "ブダペスト", "1", "Tokyo"]
print(cities.sorted())
// 出力:["1", "Tokyo", "ろーま", "ブダペスト", "ロンドン", "東京"]

要素を逆順にする

reversed()で可能。ただし、単純に逆順にするのではなく元の配列を逆順にしたことを記憶しているらしい。

Tip: When you reverse an array, Swift is very clever – it doesn’t actually do the work of rearranging all the items, but instead just remembers to itself that you want the items to be reversed. So, when you print out reversedPresidents, don’t be surprised to see it’s not just a simple array any more!
(訳)ヒント: 配列を反転させるとき、Swift は非常に賢いです - 実際にはすべての項目を並べ替える作業を行わず、代わりに項目を反転させたいことを自分自身に記憶させます。ですから、reversedPresidents をプリントアウトするとき、それがもう単なる配列でないことを見て驚かないでください!

let presidents = ["Bush", "Obama", "Trump", "Biden"]
let reversedPresidents = presidents.reversed()
print(reversedPresidents)
// 出力:ReversedCollection<Array<String>>(_base: ["Bush", "Obama", "Trump", "Biden"])

辞書型とOptional

辞書型は以下のように定義できる。

let employee = [
    "name": "Taylor Swift",
    "job": "Singer", 
    "location": "Nashville"
]

ただし、普通に出力するとOptional("Taylor Swift")のように表示されるし、コード上でも「Expression implicitly coerced from 'String?' to 'Any'」の警告が出る。辞書型は任意の値をキーにして値を呼び出せるため、キーに対応する値が存在しない可能性もある。そのため「値が存在することはオプションのひとつである」という意味でOptionalが付く。また、SwiftではそのようなことをOptionalという。(⚡️初学者のため理解が誤っている可能性もあり⚡️)

print(employee["name"])
// Expression implicitly coerced from 'String?' to 'Any'の警告文が表示される
// 出力:Optional("Taylor Swift")

Optionalを回避するためには、与えられたキーに対応する値が存在しない場合の値をデフォルト値として決めておけばよい。

print(employee["name", default: "Unknown"])  // デフォルト値として"Unknown"を設定
// 出力:Taylor Swift

列挙型

値を間違えにくいのと、文字列ではなく数字で探索し計算が早いので列挙型というものが存在する。以下のように使う。

enum Weekday {
    case monday
    case tuesday
    case wednesday
    case thursday
    case friday
}
var day = Weekday.monday
day = Weekday.tuesday
day = Weekday.friday

もしくは

enum Weekday {
    case monday, tuesday, wednesday, thursday, friday
}
var day = Weekday.monday
day = .tuesday
day = .friday

Discussion