[解決済み】Swiftで型付き配列を拡張するにはどうすればいいですか?
質問
どうすればSwiftの
Array<T>
または
T[]
をカスタム機能ユーティリティで作成することはできますか?
Swift の API ドキュメントをブラウズすると、Array メソッドが
T[]
などがあります。
extension T[] : ArrayType {
//...
init()
var count: Int { get }
var capacity: Int { get }
var isEmpty: Bool { get }
func copy() -> T[]
}
同じソースをコピー&ペーストして、こんなバリエーションを試した場合。
extension T[] : ArrayType {
func foo(){}
}
extension T[] {
func foo(){}
}
というエラーが出てビルドに失敗します。
名目上の型
T[]
拡張できない
完全な型定義を使用すると、次のように失敗します。
Use of undefined type 'T'
は、すなわち
extension Array<T> {
func foo(){}
}
また、次のようにしても失敗します。
Array<T : Any>
と
Array<String>
.
不思議なことに、Swiftは型付きでない配列を拡張することができます。
extension Array {
func each(fn: (Any) -> ()) {
for i in self {
fn(i)
}
}
}
で呼び出すことができます。
[1,2,3].each(println)
しかし、メソッドを通過する際に型が失われるようで、適切な汎用型拡張を作成することができません。 Swift の組み込みフィルタを :
extension Array {
func find<T>(fn: (T) -> Bool) -> T[] {
var to = T[]()
for x in self {
let t = x as T
if fn(t) {
to += t
}
}
return to
}
}
しかし、コンパイラはこれを型付けされていないものとして扱い、拡張子を呼び出すことを許可します。
["A","B","C"].find { $0 > "A" }
そして、デバッガでステップスルーすると、その型が
Swift.String
にキャストせずに String のようにアクセスしようとすると、ビルドエラーになります。
String
最初に、つまり
["A","B","C"].find { ($0 as String).compare("A") > 0 }
組み込みの拡張機能のように動作する型付き拡張メソッドを作成する適切な方法をご存知の方はいらっしゃいますか?
どのように解決するのですか?
型付き配列を拡張するために クラス の場合、以下のようにするとうまくいきます(Swift 2.2 ). 例えば、型付き配列をソートする場合。
class HighScoreEntry {
let score:Int
}
extension Array where Element == HighScoreEntry {
func sort() -> [HighScoreEntry] {
return sort { $0.score < $1.score }
}
}
でやってみる。 構造体 または タイプエイリアス はエラーになります。
Type 'Element' constrained to a non-protocol type 'HighScoreEntry'
更新情報 :
型付き配列を拡張するために 非クラス は、次のような方法をとります。
typealias HighScoreEntry = (Int)
extension SequenceType where Generator.Element == HighScoreEntry {
func sort() -> [HighScoreEntry] {
return sort { $0 < $1 }
}
}
で スウィフト3 の一部の型は名前が変更されました。
extension Sequence where Iterator.Element == HighScoreEntry
{
// ...
}
関連
-
[解決済み] 代入A(:)=Bにおいて、AとBの要素数は同じでなければならない
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み] JavaScriptで配列の先頭に新しい配列要素を追加するにはどうすればよいですか?
-
[解決済み] JavaScriptで配列を比較する方法は?
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み】配列に何かを追加する方法は?
-
[解決済み】JavaScriptで2つの配列を結合し、項目の重複を排除する方法
-
[解決済み】Bashでスペースで区切られた文字列を配列に読み込む
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 代入A(:)=Bにおいて、AとBの要素数は同じでなければならない
-
[解決済み] 引数として渡された配列のサイズ取得
-
[解決済み] TypeScriptと配列のリデュース関数
-
[解決済み】TypeScriptで複数の型を持つ配列を定義する
-
[解決済み】Swiftで配列をシャッフルするにはどうすればいいですか?
-
[解決済み】Swiftの配列で要素の合計を求める
-
[解決済み】Rubyで区切り文字列を分割し、配列に変換する方法は?
-
[解決済み】Bashで配列をスライスする方法
-
[解決済み】240以上の要素を持つ配列に対してループ処理を行うと、パフォーマンスに大きな影響があるのはなぜですか?
-
[解決済み】Swiftの配列の代入が矛盾している(参照でも深層コピーでもない)理由はあるのか?)