2016-05-19 12 views
2

レシピマネージャのアプリに成分スケーリング機能を提供しようとしています。 スケーリングされた結果は表示目的のみであり、永続化されません。文字列内の数字を検索して計算する、文字列に挿入する(Swift)

揚げた米のレシピがあり、その成分は2 bowls of rice, 1 egg, 1 tbsp soy sauceで、これは2人前分です。

があります - と、この番号「2」の間の+ボタンがたび - 2 +

ようになります/デクリメント食分をインクリメントする - と+アイコンが押され、それから番号を取得する関数を実行します成分ストリングと1食分の成分量を得る。レシピデータは任意のサービングサイズで保存できるので、スケーリングのためには常に1サービング分から開始する必要があります。 私の例では、1サービング成分の量は1 bowls of rice, 0.5 egg, 0.5 tbsp soy sauceなので、[1, 0.5, 0.5]となるはずです。

次に、ユーザーの行動に基づいて原料の量を調整することができます。 これまでのところ、成分文字列全体から数列を取り出し、それを配列にしてInt配列に変換する次のコードを見つけました。

ここから数値を計算するさまざまな方法を試しましたが、期待された数値が得られませんでした。私は何を達成していないことである。

  • は1つのサービス提供量に+に基づいて
  • 規模の量は、Get - アクション
+3

私はあなたが間違った終わりからこれに近づいていると思います。データソースは、すべての成分(文字列として)と金額(数値として)を持つ構造体でなければなりません。構造体の配列その後、金額を簡単に変更することができます。そのデータソースから、表示用のテキスト表現を作成します。 –

+0

はい、あなたは正しいです。理想的なデータモデルは量と成分を別々に分けることです。しかし、スケーリング機能以外に、私は成分の部分を扱うものを提供しないので、私は簡単な方法を選んだ。モバイルデバイスなどで簡単に入力できるように、全体的な文字列にすることの利点があります。私は、特定の状況でそのような機能を提供したい場合、回避策を探しています。 –

+0

はこちら[米2杯、卵1個、醤油大さじ1個]アレイ? – Madhumitha

答えて

2

を表示するには、元の文字列での演算結果を挿入されていますそれはあなたが必要なものですか?

extension Float { 
    var cleanValue: String { 
     return self % 1 == 0 ? String(format: "%.0f", self) : String(self) 
    } 
} 

let item = "1 bowls of rice, 0.5 egg, 0.5 tbsp soy sauce" 

func computeServing(inputString: String, servingCount:Int) -> String { 
    var components = item.componentsSeparatedByString(" ") 

    for idx in 0..<components.count { 
     if let integer = Int(components[idx]){ 
      components[idx] = String(integer * servingCount) 
     } else if let float = Float(components[idx]){ 
      components[idx] = String((float * Float(servingCount)).cleanValue) 
     } 
    } 

    return components.joinWithSeparator(" ") 

} 

computeServing(item, servingCount: 3) 
1

以下は、文字列から成分情報を抽出します。これに基づいて、データを操作してコンポーネントを再び結合することができます。 (あなたのために少し課題が残っている;))

func extractInfo(text: String!) -> [(String, Double)] { 

    let regex = try! NSRegularExpression(pattern: "(([0-9.]+)([^0-9]+))", options: []) 
    let nsString = text as NSString 
    let results = regex.matchesInString(text, options: [], range: NSMakeRange(0, nsString.length)) 

    return results.map { 
     (nsString.substringWithRange($0.rangeAtIndex(3)), Double(nsString.substringWithRange($0.rangeAtIndex(2)))!) 
    } 
} 

let input = "12 bowls of rice, 1 egg, 0.5 tbsp soy sauce" 
extractInfo(input) 

それは、与えられた入力に対して出力:

[( "米のボウル、"、12)、( "卵"、1) 、 "(大さじ醤油"、0.5)]

与えられたコードはエラー処理をまったくしません。オプションの解析されたDoubleを強制的に展開し、それぞれの正規表現のマッチが4つのグループを含むことを期待しています。プログラムのクラッシュを避けるために実際にtiを実行する前にチェックする必要があります。

関連する問題