まだSwiftで消耗してるの?

2,966 views

Published on

第12回potatotipsで発表した資料です。
http://connpass.com/event/10283/

資料はSwift1.2の仕様であり、現在とは違っています。

Published in: Technology

まだSwiftで消耗してるの?

  1. 1. Swiftのメソッドに関す る引数の仕様について 株式会社キュリオシティソフトウェア 今城善矩(@yimajo) potatotips #12 Xcode6.1
  2. 2. まず最初に
  3. 3. 好きですSwift *こう書いておくとSwiftをdisってると思われるはずがない
  4. 4. Swiftのメソッドには キーワード引数のようなもの がある *引数の順序は必要なため、厳密には キーワード引数 とは呼べないが便宜上
  5. 5. しかし引数のルールは 複雑
  6. 6. かっこいいメソッド名 を定義したい *ここでのかっこ良さとは、役割を明確にし理路整然とした定義をしたいということです
  7. 7. Swiftのコードは Objective-Cで呼び出すことがで きるので比較分類しつつ整理する
  8. 8. 用語 class Hoge { func instanceMethod(string str: String) { } } 外部引数名 内部引数名 • 外部引数(External Parameter) • 内部引数(Local Parameter)
  9. 9. アジェンダ • 外部引数名を指定しない例 • 外部引数名を指定する例 • 外部引数名と内部引数名を同じにする例。記号 # • 外部引数名を省略したい場合の例。記号 _ • おまけ • イニシャライザ • 関数の場合
  10. 10. 外部引数名を指定しない 例
  11. 11. class Hoge { // 外部引数名を指定していない func instanceMethod1(str1: String, str2: String)->String { } } let word = hoge.instanceMethod1(“hello”, str2:“world”) String *word = [hoge instanceMethod1:@“hello” str2:@“world”]; Swiftでこのメソッドを呼び出す場合 Objective-Cでこのメソッドを呼び出す場合 第2引数以降の内部引数名が外部引数名に
  12. 12. なぜこんなルールがあるか考察
  13. 13. • Objective-Cでもインスタンスメソッドでは外部 引数名を指定しないことはほとんどない • なるべく文として読ませるようにしている • ただSwiftでは第1引数のみの場合など特に外部 引数名を加えるのは不自然な場合が多い • 折衷案として第2引数以降は何も指定しなけれ ば外部引数名とした方が良いと思えなくもない
  14. 14. 外部引数名を指定する 例
  15. 15. class Hoge { // 外部引数名”string”と”andString”を指定する func instanceMethod2(string str1: String, andString str2: String) -> String { } } let word = hoge.instanceMethod2(string:“hello”, andString:“world”) String *word = [hoge instanceMethod2WithString:@“hello” andString:@“world”]; Swiftでこのメソッドを呼び出す場合 Objective-Cでこのメソッドを呼び出す場合 外部引数名を指定されている 自動でWith+外部引数名の頭文字が大文字に!
  16. 16. なぜこんなルールがあるか考察
  17. 17. • Objective-Cでは第1外部引数名がWith+大文字 で始まる場合が多い • Swiftで書いたコードもObjective-Cから自然 に使える
  18. 18. 外部引数名にbyやforとか前置詞を明示したら WithByHogeとかになるのか実験してみた件
  19. 19. class Hoge { // 明示的にby付けたらWithByって自動で付加されるか実験 func instanceMethod(byString str1: String, andString str2: String) -> String {} // 同じく明示的にfor func instanceMethod(forString str1: String, andString str2: String) -> String {} } String *word = [hoge instanceMethodByString:@“hello” andString:@“world”]; なんと、Objective-Cで外部引数名に前置詞を指定すると Withなくなって定義される!! String *word = [hoge instanceMethodForString:@“hello” andString:@“world”]; Objective-Cでこのメソッドを呼び出す場合
  20. 20. Withがなくなる前置詞を調査 • Withがなくなった前置詞 • for, by, in, on, of, to, at, from, below • Withがなくならなかった前置詞 • over, under, about, round, around
  21. 21. ここらへんのObjective-Cとのブリッジは Swiftのバージョンアップによってブレそうな気 がする…
  22. 22. 好きですSwift *こう書いておくとSwiftをdisってると思われるはずがない
  23. 23. 外部引数名と内部引数名同じ にする場合は#を付ける 例
  24. 24. class Hoge { // 外部引数名と内部引数名を同じにする場合は引数名に#を付ける func instanceMethod3(#str1: String, str2: String) -> String { } } let word = hoge.instanceMethod3(str1:“hello”, str2:“world”) String *word = [hoge instanceMethodWithStr1:@“hello” str2:@“world”]; Swiftでこのメソッドを呼び出す場合 Objective-Cでこのメソッドを呼び出す場合 str1 str1: Stringという形にはしない str1が外部引数名となっている
  25. 25. 感想
  26. 26. インスタンスメソッドの第1外部引数に # を付 けるのは、Objective-Cで前置詞Withを使うな ら自然な感じになる
  27. 27. 外部引数名を省略したい場合 _ を付ける 例
  28. 28. class Hoge { // 第一でない外部引数名が自動なのをやめる場合は_を付ける func instanceMethod4(str1: String, _ str2: String) -> String { } } let word = hoge.instanceMethod4(“hello”, “world”) String *word = [hoge instanceMethod4:@“hello” :@“world”]; Swiftでこのメソッドを呼び出す場合 Objective-Cでこのメソッドを呼び出す場合 Objective-Cでは珍しい形になった
  29. 29. Swiftでは省略するときに _ がよく使われる 省略して、外部引数名が 無い から 下にバーが有るだけの存在感の薄い記号 _ だと思うと 覚えられる
  30. 30. イニシャライザの場合
  31. 31. class Age { // イニシャライザ init (str: String) { } // 1. 外部引数名は指定しない init (_ str: String) { } // 2. イニシャライザの引数名に_ } let age1 = Age(str: “18”) // 1. 内部引数名が外部引数名に! let age2 = Age(“18”) // 2. 省略されてシンプル Hoge *hoge1 = [Age alloc] initWithStr:@“18”]; // 1. With+Str Hoge *hoge2 = [Age alloc] init:@“18”]; // 2. 省略された Swiftでこのイニシャライザを呼び出す場合 Objective-Cでこのメソッドを呼び出す場合 省略はObjective-Cでは少し違和感のある珍しい形に イニシャライザの場合は第1引数でも内部引数名が外部引数名になる
  32. 32. なぜこんなルールがあるか考察
  33. 33. Objective-Cのイニシャライザでは 外部引数名を省略しないユースケースは多い
  34. 34. この部分に関しては特に SwiftはObjective-Cに引っ張られている
  35. 35. 関数の場合
  36. 36. メソッドとイニシャライザで ルールが微妙に違うように 関数もまた微妙に違っている
  37. 37. 関数の場合はシンプル 引数が第1であろうがなかろうが 外部引数名を指定しない場合に 内部引数名は外部引数名にならない
  38. 38. まとめ
  39. 39. メソッド イニシャライザ 関数 第1の外部引数名を 明示しない 外部引数名なし 内部引数名が外部引数 名になり場合により前 置詞が付く 外部引数名なし 第2以降の外部引数名を 明示しない 内部引数名が外部引数 名になる 内部引数名が外部引数 名になる 外部引数名なし 第1の外部引数名を 明示する 内部引数名が外部引数 名になり場合により前 置詞が付く 内部引数名が外部引数 名になり場合により前 置詞が付く 明示される 第2以降の外部引数名を 明示する 明示される 明示される 明示される
  40. 40. まだSwiftで 消耗してるの? 以上です 残り時間で何か質問ありますか?

×