2016-05-31 8 views
2

Doubleをカスタム変換でStringに拡張したいと思っていますが、これはクラス/構造体の実装に限定したいと思います。 Doubleにちょうど直接ダブルの延長と同じ結果を生成することを適用するDoubleを自分の構造体内で拡張する

protocol DoubleCustomStringConvertable { ... } 

extension Double { 
    var customStringOutput: String { 
    guard self >= 0.0 else { return "Invalid" } 
    return "My number is: \(self)" 
    } 
} 

struct MyStruct { 
    var myNumber: Double = 100.0 
} 

let myStruct = MyStruct() 
let doubleFail = 99.0 
print(myStruct.myNumber.customStringOutput) //"My number is: 100.0" 
print(doubleFail.customStringOutput)   //"My number is :99.0" - Should fail 

のために私は次のようなプロトコルを作成しようとしました。私は構造体の中でdoubleをパラメータとしてとり、という文字列を返します。は私の問題を解決しますが、これは学習の練習のほうが多く、私はプロパティのより洗練された構文が好きです。

私の定義した構造内でDoubleのプロトコルのみを適用できるようにするにはどうすればよいですか?これはおそらくとても簡単なので、私は自分自身をキックするでしょう!

+0

Doubleでプライベートエクステンションを検討しましたか? https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html#//apple_ref/doc/uid/TP40014097-CH41-ID25 – JAL

答えて

1

プロトコルにするのではなく、構造内で定義された関数にする。プロトコルの範囲を制限する方法はありません(値Doubleの値のタイプはMyStructのようになります)。

+0

私が言及したように、私はそれをすることができました。その定義を必要とするさまざまな構造のコードを複製しています。関数をプロトコルに入れてそれを必要とする構造体に適用することもできますが、機能的には同等かもしれませんが、func(double)ではなくdouble.parameterの構文も気に入っています。 (コード補完)、特定の倍数に制限するなど – DJohnson

関連する問題