2016-10-09 1 views
0

간단한 변환 (예 : 미터법)을 사용하고 있습니다. 나는 (String, Closure) 요소를 가진 튜플 배열을 만들었다. 이렇게하면 변환을위한 문자열을 넣을 수 있습니다 (예 : "miles to 킬로미터"를 피커 컨트롤에 넣고 한 줄에 연결된 수식을 참조하여 변환 할 값을 전달하십시오. 문제는 $ 0 . 폐쇄 속기 나는 "적절한 시간에 해결하기 위해 너무 복잡 식입니다."오류가 발생Xcode Swift : 합리적인 시간에 해결하기에는 표현식이 너무 복잡합니다.

가 여기에 작동 선언 & 코드입니다 :

var formulaTuple = [(convString: String, convFormula: ((Double) -> Double))]() 
: 초기 class 문 아래의 ViewController의 속성 선언

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

관련 문제