2016-04-06 8 views
2

XcodeのプレイグラウンドでArrayに拡張機能を書き込もうとしています。関数が呼び出されたときに0で埋められるように配列を変更する関数を記述したいと思います。私は自分自身から値を「取得」しようとした場合、しかし、配列の拡張子、メンバー 'subscript'へのあいまいな参照

self[i] = 0 

:このコードはでエラーのため、実行されません

import Foundation 

extension Array { 
    mutating func zero() { 
     for i in 0..<self.count { 
      self[i] = 0 // ERROR - Ambiguous reference to member 'subscript' 
     } 
    } 
} 

:私が使用しようとしているコードはこれです、私は問題はありません。たとえば、

import Foundation 

extension Array { 
    mutating func zero() { 
     for i in 0..<self.count { 
      print(self[i]) 
     } 
    } 
} 

にはエラーはなく、期待どおりに動作します。

私の質問は次のとおりです。アレイを変更できないのはなぜですか?交換また

、:と

self[i] = 0 

self.append(0) 

も誤差が生じます。 ( '(int)'型の引数リストで 'append'を呼び出すことはできません)

それで、私はそれを変えることはできません。

答えて

4

それはあなたが次の操作を行う場合に動作します:

extension Array where Element: IntegerLiteralConvertible { 
    mutating func zero() { 
     for i in 0..<self.count { 
      self[i] = 0 
     } 
    } 
} 

をあなたは、例えば、Stringの配列をゼロにすることはできませんので、あなたは、許可される要素の型を制約する必要があります。

Arrayのようなものを拡張する場合は、追加するメソッドに有効な要素のタイプを考慮する必要があります。特定のタイプの要素が必要な場合は、その要素に制約を加えてから機能します。その方法では、intを含むArrayのメソッドしか使用できません。配列内のすべてを文字列 "ゼロ"で置き換えるStringの配列に対して別のバージョンを定義することができます。その実装は、それを拘束する型に対してのみ使用されます。

+1

または '要素:IntegerLiteralConvertible'を使用すると、(整数または浮動小数点値の配列に対して)少し普遍的にすることができます。 –

+0

ありがとう、@ MartinR、その変更を行った! – Gavin

+0

ありがとうGavinと@Martin R!これにより、エラーが修正されます。私はこのトピックをもっと深く、今日後で掘り下げて調べる必要があります。 – OhNo

関連する問題