脱swift初心者する
ための2つのきっかけ
@mogmet
About me
• twitter: @mogmet
• 好物:iOS, php, MySQL, Oracle
• 仕事:インフラエンジニア→iOSエンジニア→DBA
• ブログ: http://mogmet.com/
• 作ったアプリたち↓

ワンナイト人狼 for iPhone STARBUCKSHOLIC
1. 関数型言語を使おう!
きっかけはとあるエンジニア
から聞いた一言
いやー、swiftで書き始めたらfor文
とかマジ書かなくなったわーwwww
出典:http://jigokuno.com/eid_162.html
swiftは関数型もサポートした
言語
これを使いこなせれば脱初心者できるし、
コードもよりスマートに短くかける!!
filter
filter
• 効用:配列の中から取り出したいものだけ取り
出せます。
filter
• 例:配列の中から偶数だけ取り出してみる。
Before
let numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
var evenNumbers:[Int] = []
for number in numbers {
if number % 2 == 0 {
evenNumbers.append(number)
}
}
print(evenNumbers) // [0, 2, 4, 6, 8, 10]
After
let numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers) // [0, 2, 4, 6, 8, 10]
filter
• 例:もうちょっと実践編
before
class Human {
let name: String
init (name: String) { self.name = name }
}
let humans = [
Human(name: "綾波レイ"),
Human(name: "式波・アスカ・ラングレー"),
Human(name: "綾波レイ")
]
var ayanamis:[Human] = []
for human in humans {
if human.name == "綾波レイ" {
ayanamis.append(human)
}
}
print(ayanamis.count) // 2
After
class Human {
let name: String
init (name: String) { self.name = name }
}
let humans = [
Human(name: "綾波レイ"),
Human(name: "式波・アスカ・ラングレー"),
Human(name: "綾波レイ")
]
let ayanamis = humans.filter { $0.name == "綾波レイ" }
print(ayanamis.count) // 2
indexOf
indexOf
• 効用:配列の中から指定したもののindex値を返
します
indexOf
• 例:配列の特定の文字列の時のindex値を取り出
す。
Before
let lineA = ["a", "i", "u"]
var index = 0
for (var i = 0; i < lineA.count; i++) {
if lineA[i] == "i" {
index = i
}
}
print(index) // 1
こんな風にもかけるけど
let lineA = ["a", "i", "u"]
var index = 0
for (i, v) in lineA.enumerate() {
if v == "i" {
index = i
}
}
print(index) // 1
After
let lineA = ["a", "i", "u"]
if let index = lineA.indexOf("i") {
print(index) // 1
}
map
map
• 効用:配列の要素に対して処理ができる
map
• 例:文字列の配列の値を使って初期化したクラ
スを生成する
Before
class Human {
let name: String
init (name: String) { self.name = name }
}
let children = ["綾波レイ", “式波・アスカ・ラングレー",
"真希波・マリ・イラストリアス"]
var humans:[Human] = []
for child in children {
humans.append(Human(name: child))
}
print(humans) // [Human, Human, Human]
After
class Human {
let name: String
init (name: String) { self.name = name }
}
let children = ["綾波レイ", “式波・アスカ・ラングレー",
"真希波・マリ・イラストリアス"]
let humans = children.map { Human(name: $0) }
print(humans) // [Human, Human, Human]
本当はこのまま関数ネタを

続けようと思いましたが
詳しくは下記
Swiftのmap, filter, reduce(などなど)
はこんな時に使う!
http://qiita.com/mo_to_44/items/
cf83b22cb34921580a52
2. {}を減らそう!
guard let
guard let
• unwrapする時のネストを減らせる
func useMagic() {
let maybeMagicalGirl: String? = "鹿目まどか"
if let magicalGirl = maybeMagicalGirl {
print(magicalGirl) // 鹿目まどか
// 契約する
// 変身する
// 魔法を使う
// 世界を変える
// ...
}
}
Before
{}が長すぎる!
func useMagic() {
let maybeMagicalGirl: String? = "鹿目まどか"
guard let magicalGirl = maybeMagicalGirl else {
return
}
print(magicalGirl) // 鹿目まどか
// 契約する
// 変身する
// 魔法を使う
// 世界を変える
// ...
}
After
{}内の記述量を減らせるので
見やすくなる!
where
Before
func useMagicalSwordsman() {
let maybeMagicalSwordsman: String? = "美樹さやか"
guard let magicalSwordsman = maybeMagicalSwordsman else {
return
}
if magicalSwordsman == "美樹さやか" {
print(magicalSwordsman) // 美樹さやか
// あたしってほんと...カバ
}
}
せっかく{}を減らしてもまた{}
が増えている!!
After
func useMagicalSwordsman() {
let maybeMagicalSwordsman: String? = "美樹さやか"
guard let magicalSwordsman = maybeMagicalSwordsman
where magicalSwordsman == "美樹さやか" else {
return
}
print(magicalSwordsman) // 美樹さやか
// あたしってほんと...カバ
}
{}を減らせるのでオススメ!
まとめ
まとめ
• 関数型を使って短く書こう!
• {}をどんどん減らして保守性を高めよう!
御静聴ありがとうございました

脱swift初心者するための2つのきっかけ