前提
Arrayの連結を行う++
演算子を定義しています.
swift
1 2infix operator ++ : AdditionPrecedence 3 4extension Array { 5 static func ++(lhs: Array, rhs: Array) -> Array { 6 var result = lhs 7 result.append(contentsOf: rhs) 8 return result 9 } 10}
発生している問題
連結自体はできるのですが, lhsとrhsの型が違う場合, Array<Any>
型の値を返してしまいます.
swift
1print(type(of: ([1,2,3] ++ [4]))) // Array<Int> 2print(type(of: ([1,2,3] ++ ["str"]))) // Array<Any>
実現したいこと
Haskellの++
演算子のように要素の型が違う場合,エラーを発生させたいです.
ghciでの実行結果は以下のようになります
haskell
1:t [1,2,3] ++ [4] 2[1,2,3] ++ [4] :: Num a => [a] 3 4:t [1,2,3] ++ ["str"] -- error 5-- No instance for (Num [Char]) arising from the literal ‘1’ 6
試したこと
Swiftの+
演算子は前提で書いた実装と似たような挙動をしていました.
swift
1print(type(of: ([1,2,3] + [4]))) // IndexPath 2print(type(of: ([1,2,3] + ["str"]))) // Array<Any>
そもそも要素の型指定はできないからこうなっているのか, 意図してこういう挙動にしているのかわかりませんでした.
そこもできれば教えていただきたいです.
またダメ元でGenericsを使ってやってみましたが,演算子に型変数をつけることができなかったので,ダメです.
補足情報(FW/ツールのバージョンなど)
OS: macOS 10.14.6
Apple Swift version 5.1 (swiftlang-1100.0.270.13 clang-1100.0.33.7)
Target: x86_64-apple-darwin18.7.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/17 13:55
2019/11/17 14:20 編集
2019/11/17 14:39 編集
2019/11/18 01:16
2019/11/18 01:25
2019/11/18 02:20