2016-04-19 5 views
0

私はこの問題に繰り返しぶつかります。実際の生活では、私は特定の品質を表す数字のセットを見ていますが、私はそれらをSwiftの特殊なタイプとして表現するのが難しいです。Swiftで制約付きタイプを定義するにはどうすればよいですか?

たとえば、パーセントタイプ。私は整数だけでパーセント型をしたいとしましょう。また、このパーセントは決して100以下になることはありません。

純粋なCで、ユニオンとして、0から100までの範囲のメンバーで表すことができます。しかし、基本的な値型を持つSwift列挙型を使用しても、アプローチを修正することはできません。またはそれは?

別のものを選びましょう。 Bribor Interbank金利。私はいつもそれが0から20パーセントの範囲になることを知っています。しかし、数値自体は小数点以下2桁の小数点になります。

Swiftでこの問題を処理する正しい方法は何ですか?おそらくジェネリック?おそらく

+2

"これを純粋なCでユニオンとして表現できました"。そのコードを表示してください。 – hnh

+0

私はタイプの "制約"についてすべて私がグーグルを含んでいることができます。これが私の問題だった場合は、オブジェクトのinitまたはsetterの入力をチェックしたり、制約したりする独自のクラス(たとえば、 "BriborInterest'")を作成しています。 I.入力が有効でない場合は、例外をスローするかnilを返します。 –

答えて

1

マイケルはコメントで述べているように、このような何か:

struct IntPercent { 
    let value : Int8 
    init?(_ v : Int) { 
    guard v >= 0 && v <= 100 else { return nil } 
    value = Int8(v) 
    } 
} 

(注意:構造体ではなく、そのようなベース値のためのクラスを使用します)

あなたがその多くを行う場合、あなたは少しのプロトコルを使用していることを向上させることができ、そのよう:

protocol RestrictedValue { 
    associatedtype T : Comparable 
    static var range : (T, T) { get } 
    var value : T { set get } 
    init() // hack to make it work 
} 

extension RestrictedValue { 
    init?(v: T) { 
    self.init() 
    guard Self.range.0 <= v && Self.range.1 >= v else { return nil } 
    value = v 
    } 
} 

struct IntPercent : RestrictedValue { 
    static var range = (0, 100) 
    var value : Int = 0 
    init() {} 
} 

私はあなたが基本型の値を制限するために、ジェネリックを使用することができないと思います。

しかし、私は賭けにもよりよい解決策がある - この1つは間違いなくある

0

は、オブジェクトの値を制約:-) awezomeないが制約された型と同じではありません。あなたが話していることは単なる数字なので、数値の制約値は本当に意味をなさない - 百分率やBribor-Interbank-Interest-rate-numberなどのものはありません。彼らは単なる数字です。あなたがその価値を制限したいのであれば、あなたはその数字を入手したり使用したりしてどこでもそれを行います。新しいタイプを定義するだけでは、既存のタイプの値を制約するのは意味がありません。

関連する問題