2017-10-31 9 views
2

明示スウィフト延長でElementオブジェクトを初期化する他の方法があるのだろうか?スウィフト拡張と「要素」明示的な初期化

私はこれをやりたいが、私はexpectedSum割り当てに強制要素鋳造を削除し、コンパイラの使用を許可すれば非公称型「Elementは」もちろん、明示的な初期化

extension Array where Element: Numeric { 
    func findDuplicate() -> Int { 
     guard self.count > 0 else { return -1 } 
     let sum = self.reduce(0, +) 
     let expectedSum = Element((self.count - 1) * self.count/2) 
     return sum - expectedSum 
    } 
} 

をサポートしていません例えば

Intが、私は、私は簡単にこれは、このようにしていない、より汎用的であるところの要素==のIntもちろんでの作業私の拡張子を持つことができ、エラー比較合計(要素)を取得し、expectedSum(INT)

ヒントNumericタイプの整数の

+1

まず、あなたの配列が空であるかどうかを確認するために、カウントプロパティを使用しないでください。 2番目の引数は、-1を返す代わりに戻り値の型をオプションにします。あなたの方法は何をすべきか? –

+0

Intを返す場合は、汎用とすることが目的です。 ? '要素を返す'と '使用BinaryInteger'や'代わりNumeric' –

+1

それは、上記のアルゴリズムを実装してどのように非常に不明確だ 'のFloatingPoint'「重複を見つけます。」戻り値の意味は何ですか?なぜそれは整数ですか(それはどのように "重複"ですか)?この場合、「明示的に初期化する」とはどういう意味ですか? 'Numeric'は' BinaryInteger'から変換するための 'init?(exactly:)'を含みます( 'count'は常に' Int'ですので、適用されます)。しかし、このコードが何を意味するのかは非常に不明です。 –

答えて

4

変換はinit?(exactly:)で行われます。アカウントにレオの提案を取る:一方

extension Array where Element: Numeric { 
    func findDuplicate() -> Element? { 
     guard !isEmpty else { return nil } 
     let sum = self.reduce(0, +) 
     guard let expectedSum = Element(exactly: (count - 1) * count/2) else { return nil } 
     return sum - expectedSum 
    } 
} 

を、これは は、具体的には約整数、あるし、それは(BinaryIntegerに要素の型を制限するより多くの意味 を作るかもしれないプログラミング作業のようですそして、)オーバーフローを回避するために、中間計算のためInt を使用:

extension Array where Element: BinaryInteger { 
    func findDuplicate() -> Element? { 
     guard !isEmpty else { return nil } 
     let sum = Int(reduce(0, +)) 
     let expectedSum = (count - 1) * count/2 
     return Element(sum - expectedSum) 
    } 
} 

あるいはElement == Int

+0

正確;-) !!! –

+0

はありがとうございます。 Btw私は上記のコメントに同意します。「n個の数字の配列に重複を見つける+ 1」コードは、私の問題を説明する簡単な方法でした。@LeoDabusメソッド1 ... nの値と重複したランダムな順序の配列を持つ特定のシナリオでのみ動作します。これは、ExtensionのElement explicit initializationの使い方を説明する簡単な例です。 –

関連する問題