しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Swiftで要素が一つだけのタプルはタプルではなくなる

今日面白い現象に遭遇したのでメモ。
タイトルの通り、要素が1つのタプルはタプルとして扱われないようです。

let tuple1 = (key1: "value1")
print(tuple1.dynamicType) // → String, 本来は(String)となるはず

let tuple2 = (key1: "value1", key2: "Value2")
print(tuple2.dynamicType) // → (String, String)

実際にタプルのメソッドを呼びだそうとしてもエラーが出ます。

let tuple1 = (key1: "value1")
tuple1.key1 // 'String' does not have a member named 'key1'というエラーになる

let tuple2 = (key1: "value1", key2: "Value2")
tuple2.key1

それに関連してか、メソッドの引数には要素が1つでキー付きのタプルを引数にできないようです。

// Cannot create a single-element tuple with an element labelというエラーになる
func method1(tuple: (key1: String)) {}

// これはOK、tupleはString型になっている
func method2(tuple: (String)) {}