2016-10-09 7 views
0

私は単純な変換を行っています(例えば、imperialからmetricへ)。私は(String、Closure)要素を持つタプルの配列を作成しました。これにより、変換の文字列(たとえば「マイルからキロメートル」をピッカーコントロールに入れて、関連する数式を1行で参照して変換する値を渡すことができます。 。「合理的な時間内に解決するには複雑すぎる表現」:Xcode Swift:式が複雑すぎて妥当な時間に解決できない

は、初期クラスステートメントの下のViewControllerのプロパティを使用して宣言:

var formulaTuple = [(convString: String, convFormula: ((Double) -> Double))]() 
閉鎖速記私はエラーを取得する

はここで働く宣言&コードです

viewDidLoad()で割り当てられる

formulaTuple = [("miles to kilometers", {(a: Double) -> Double in return (a/0.62137) }), 
       ("kilometers to miles", {(a: Double) -> Double in return (a * 0.62137) }), 
       ("feet to meters", {(a: Double) -> Double in return (a/3.2808) }), 
       ("yards to meters", {(a: Double) -> Double in return (a/1.0936) }), 
       ("meters to feet", {(a: Double) -> Double in return (a * 3.2808) }), 
       ("meters to yards", {(a: Double) -> Double in return (a * 1.0936) }), 
       ("inches to centimeters", {(a: Double) -> Double in return (a/0.39370) }), 
       ("centimeters to inches", {(a: Double) -> Double in return (a * 0.39370) }), 
       ("fahrenheit to celsius", {(a: Double) -> Double in return ((a - 32) * (5/9)) }), 
       ("celsius to fahrenheit", {(a: Double) -> Double in return (a * (9/5) + 32) }), 
       ("quarts to liters", {(a: Double) -> Double in return (a/1.05669) }), 
       ("liters to quarts", {(a: Double) -> Double in return (a * 1.05669) }) ] 

コードで作業しています。ここで、rowはクリックされたピッカーの行、inputValueは変換するために渡されたもの、outputValueは変換の結果です。

outputValue = formulaTuple [行] .convFormula(inputValueで)Iは、のviewDidLoad(でこの構文を使用して宣言をダウントリムするとき

問題が生じる)の代わりに上記synatax:

formulaTuple = [("miles to kilometers", {$0/0.62137 }), 
        ("kilometers to miles", {$0 * 0.62137 }), 
        ("feet to meters", {$0/3.2808 }), 
        ("yards to meters", {$0/1.0936 }), 
        ("meters to feet", {$0 * 3.2808 }), 
        ("meters to yards", {$0 * 1.0936 }), 
        ("inches to centimeters", {$0/0.39370}), 
        ("centimeters to inches", {$0 * 0.39370 }), 
        ("fahrenheit to celsius", {($0 - 32) * (5/9) }), 
        ("celsius to fahrenheit", {$0 * (9/5) + 32 }), 
        ("quarts to liters", {$0/1.05669 }), 
        ("liters to quarts", {$0 * 1.05669 }) ] 

Iこれがよりスムーズになると思ったが、Xcodeが壊れているようだ。思考?私のアプローチは根本的に不健全で、別の方法が推奨されるのでしょうか? ありがとう!

答えて

2

大規模な配列リテラルを与えて型を解釈すると、Swiftはうまくいきません。あなたのケースでは、あなたのformulaTupleプロパティに既に確立されたタイプがあるので、これがうまくいくと思います。周りの仕事は、あなたが最初に一定の配列を初期化して、あなたの財産に割り当てることができたよう

let temp: [(String, (Double) -> Double)] = [ 
      ("miles to kilometers", {$0/0.62137 }), 
      ("kilometers to miles", {$0 * 0.62137 }), 
      ("feet to meters", {$0/3.2808 }), 
      ("yards to meters", {$0/1.0936 }), 
      ("meters to feet", {$0 * 3.2808 }), 
      ("meters to yards", {$0 * 1.0936 }), 
      ("inches to centimeters", {$0/0.39370}), 
      ("centimeters to inches", {$0 * 0.39370 }), 
      ("fahrenheit to celsius", {($0 - 32) * (5/9) }), 
      ("celsius to fahrenheit", {$0 * (9/5) + 32 }), 
      ("quarts to liters", {$0/1.05669 }), 
      ("liters to quarts", {$0 * 1.05669 }) 
] 

formulaTuple = temp 

オルタナティブ回答

タプルは本当に一時的に保存するためのものであり、関数から複数の結果を戻すことができます。

struct Conversion { 
    let string: String 
    let formula: (Double) -> Double 
} 

var conversions = [Conversion]() 

conversions = [ 
    Conversion(string: "miles to kilometers", formula: {$0/0.62137 }), 
    Conversion(string: "kilometers to miles", formula: {$0 * 0.62137 }), 
    Conversion(string: "feet to meters", formula: {$0/3.2808 }), 
    Conversion(string: "yards to meters", formula: {$0/1.0936 }), 
    Conversion(string: "meters to feet", formula: {$0 * 3.2808 }), 
    Conversion(string: "meters to yards", formula: {$0 * 1.0936 }), 
    Conversion(string: "inches to centimeters", formula: {$0/0.39370}), 
    Conversion(string: "centimeters to inches", formula: {$0 * 0.39370 }), 
    Conversion(string: "fahrenheit to celsius", formula: {($0 - 32) * (5/9) }), 
    Conversion(string: "celsius to fahrenheit", formula: {$0 * (9/5) + 32 }), 
    Conversion(string: "quarts to liters", formula: {$0/1.05669 }), 
    Conversion(string: "liters to quarts", formula: {$0 * 1.05669 }) 
] 

outputValue = conversions[row].formula(inputValue) 

スウィフトはこれで非常に幸せである、とtemp回避策は必要ありません:あなたは、配列の値の型としてstructを使用して検討する必要があります。

+1

構造体は非常にうまく機能しました。私はTuplesのSwiftドキュメントを再読み込みし、一時的なタイプについて少し注意を払った。あなたの提案、洞察、および背景を本当に感謝します。ありがとう! – Gallaugher

関連する問題