はじめに
その1の続きです。関数とクラスとかについて書きます。
関数
スタンダードなやつ
スタンダードな関数の書き方は下記
1 2 3 4 |
func 関数名(引数名: 引数の型) -> 戻り値型 { // なんか処理 return 戻り値 } |
こんな感じ
1 2 3 4 5 6 |
func add(num1: Int, num2: Int) -> Int { return num1 + num2 } // 呼び出し add(num1: 1, num2: 2) |
ラベル省略
1 2 3 4 5 6 |
func add(_ num1: Int, _ num2: Int) -> Int { return num1 + num2 } // 呼び出し add(1, 2) |
デフォルト引数
1 2 3 4 5 6 |
func printText(text1: String = "Hello", text2: String = "World") { print(text1 + " " + text2) } printText() // Hello World printText(text1: "hoge", text2: "piyo") // hoge piyo |
可長変引数
1 2 3 4 5 6 7 8 9 |
func sum(nums: Int...) -> Int { var value = 0 for num in nums { value += num } return value } sum(1, 2, 3) // 6 |
ローカル関数
関数の中に関数を定義できる。
1 2 3 4 5 |
func hoge() { func piyo() { } piyo() } |
クロージャ
1 2 3 4 5 6 7 8 9 10 11 |
let add = { (x: Int, y: Int) -> Int in return x + y } print(add(2, 3)) // 5 let plus: (Int, Int) -> Int = { $0 + $1 } print(plus(2, 3)) // 5 // 引数・戻り値なし let hogePrint: () -> Void = { print("hoge") } hogePrint() |
拡張関数
1 2 3 4 5 6 7 8 |
extension String { func appendingHogePrefix() -> String { return "Hoge" + self } } // 呼び出し print("piyo".appendingHogePrefix()) // Hogepiyo |
プロパティも拡張できる。
1 2 3 4 5 6 7 8 9 10 11 |
extension String { var hogePrefix: String { guard hasPrefix("Hoge") else { return "" } return String(prefix(4)) } } // 呼び出し print("Hogepiyo".hogePrefix) // Hoge |
おそろしく意味のない拡張。。。
クラス
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 |
class Hoge { let fuga = "fuga" var fugafuga: String { return fuga + fuga } private let piyo: String init(piyo: String) { self.piyo = piyo } init?(piyo: String?) { guard let piyo = piyo else { return nil } self.piyo = piyo } func piyopiyo() { print(piyo) } } let piyo1 = Hoge(piyo: "piyo") // nilじゃない let piyo2 = Hoge(piyo: nil) // nil |
デフォルトは internal
なので継承させたくない場合は final
を付ける。
1 2 3 4 5 6 7 8 9 10 |
// 継承不可 final class Fuga { } // 継承可 class Piyo { } class Hoge: Piyo { } |
構造体
1 2 3 4 5 6 7 8 9 |
struct Hoge { let fuga: String func piyo() { print("piyo") } } // 同一モジュール無いならデフォルトイニシャライザを呼べる Hoge(fuga: "") |
構造体自身でプロパティを書き換える場合は mutating
をつける。
1 2 3 4 5 6 7 8 9 10 11 |
struct Hoge { var fuga = "FUGA" mutating func piyo() { fuga = "piyo" } } var hoge = Hoge() // piyoで書き換えるのでvarにする必要がある print(hoge.fuga) hoge.piyo() print(hoge.fuga) |
構造体は値渡しになって事故が防げるのでできるだけクラスより構造体をつかう。
列挙型
プロパティや関数を持たすことができる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
enum Hoge { case fuga case piyo(message: String) var message: String { switch self { case .fuga: return "" case .piyo(let message): return message } } func printText() { print("hoge") } } |
ケースに Int
を持たすこともできる
1 2 3 4 5 6 |
enum Hoge: Int { case fuga = 0 // 数値書かなければ上から0 case piyo = 1 } let hoge = Hoge(rawValue: 0) // Optional(Hoge.fuga) |
ケースに String
を持たすこともできる
1 2 3 4 5 6 |
enum Hoge: String { case fuga = "FUGA" // 値を書かなければ "fuga" case piyo = "PIYO" } let hoge = Hoge(rawValue: "FUGA") // Optional(Hoge.fuga) |
さいごに
結構 enum
を多用するイメージ。便利。構造体の mutating
はあんま使っとことない。
コメント
[…] その2の続きです。その2までで Swift で書けると思いますがもっといい感じにかくための応用編です。 […]