당신이 스위프트의 기능 (또는 방법)를 설계하는 경우에는 오류를 처리하는 적어도 3 개를 선택할 수 있습니다 이 작업은 정기적으로 수행되고 선택적 유형 변수를 반환하는 것을 고려하십시오. 예를 들어, 귀하의 경우 add
메서드는 NSDecimalNumber
대신 NSDecimalNumber?
을 반환 할 수 있습니다. 이 경우 귀하의 방법은 잘못 될 수있는 모든 사항을 확인한 다음 해당 상황에서 nil
을 반환합니다. 오버플로 및 언더 플로는 nil
을 반환하고 다른 모든 경우는 NSDecimalNumber
을 반환합니다.
let brain = MathWhiz()
if let sum = brain.add("1", op2: "1e127") {
println("the result was \(sum)")
} else
println("something went wrong with MathWhiz add")
}
선택 : 2 : 호출자가이 같은 옵션 NSDecimalNumber을 확인하고 포장을 푸는해야합니다 당신이 잘못된 건에 대한 자세한 정보를 반환하려면 열거 형식을
를 돌려, 당신은 만들 수 있습니다 각 오류에 대한 값을 가진 열거 유형 및 응답을 포함하는 성공에 대한 유형입니다. 예를 들어, 당신은 할 수 :
enum MathWhizResult {
case Overflow
case Underflow
case Success(NSDecimalNumber)
}
그런 다음 추가
가
MathWhizResult
을 반환하도록 정의 될 것이다 :
func add(op1: String, op2: String) -> MathWhizResult
를 오류의 경우, add
는 .Overflow
또는 .Underflow
을 반환합니다. 성공의 경우 add
은 Success(result)
을 반환합니다. 호출자는 열거를 확인하고 결과의 압축을 풀어야합니다. switch
이 사용할 수 있습니다 :
switch (brain.add("1", op2: "1e128")) {
case .Overflow
println("darn, it overflowed")
case .Underflow
println("underflow condition happened")
case .Success(let answer)
println("the result was \(answer)"
}
선택 3 : 명시 적으로
매우 드문 오류에 대한 너무 많은 오버 헤드가 될 수있는 첫 번째 두 가지 선택의 결과를 풀기 오류를 처리 여부를 선택합니다. 결과를 반환하고 발신자가 언더 플로우 또는 오버플로 상태를 처리하도록 선택할 수 있습니다. 이 경우 그들은 add
에 전화하기 전에 이러한 조건을 스스로 점검해야합니다. 이점은 자신의 프로그램이 언더 플로 또는 오버플로를 일으키지 않는다는 것을 알고 있기 때문입니다 (예를 들어 한 자리 숫자를 처리하기 때문에). 결과를 언 패킹하는 데 부담을주지 않습니다.
난 당신이
NSDecimalNumbers
이 할 수있는 방법을 보여주기 위해 작은 응용 프로그램을 만들었습니다. 에
Single View Application
을 만들었습니다.
StoryBoard
에서
ViewController
에서 I 3 개
TextField
S (1 피연산자 각각 하나씩, 2 피연산자 및 결과) 내가
+
붙여진
Button
첨가.
ViewController.swift
import UIKit
class ViewController: UIViewController {
@IBOutlet var operand1 : UITextField!
@IBOutlet var operand2 : UITextField!
@IBOutlet var result : UITextField!
var brain = MathWhiz()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func addButton(sender : UIButton) {
var op1 = operand1.text
var op2 = operand2.text
// Perform the add with the contents of the operand fields.
// Print the answer, or "No Result" if add returns nil.
if let answer = brain.add(op1, op2: op2)?.description {
result.text = answer
} else {
result.text = "No Result"
}
}
}
MathWhiz.swift
import UIKit
// Declare that we implement NSDecimalNumberBehaviors so that we can handle
// exceptions without them being raised.
class MathWhiz: NSDecimalNumberBehaviors {
var badException = false
// Required function of NSDecimalNumberBehaviors protocol
func roundingMode() -> NSRoundingMode {
return .RoundPlain
}
// Required function of NSDecimalNumberBehaviors protocol
func scale() -> CShort {
return CShort(NSDecimalNoScale)
}
// Required function of NSDecimalNumberBehaviors protocol
// Here we process the exceptions
func exceptionDuringOperation(operation: Selector, error: NSCalculationError, leftOperand: NSDecimalNumber, rightOperand: NSDecimalNumber) -> NSDecimalNumber? {
var errorstr = ""
switch(error) {
case .NoError:
errorstr = "NoError"
case .LossOfPrecision:
errorstr = "LossOfPrecision"
case .Underflow:
errorstr = "Underflow"
badException = true
case .Overflow:
errorstr = "Overflow"
badException = true
case .DivideByZero:
errorstr = "DivideByZero"
badException = true
}
println("Exception called for operation \(operation) -> \(errorstr)")
return nil
}
// Add two numbers represented by the strings op1 and op2. Return nil
// if a bad exception occurs.
func add(op1: String, op2: String) -> NSDecimalNumber? {
let dn1 = NSDecimalNumber(string: op1)
let dn2 = NSDecimalNumber(string: op2)
// Init badException to false. It will be set to true if an
// overflow, underflow, or divide by zero exception occur.
badException = false
// Add the NSDecimalNumbers, passing ourselves as the implementor
// of the NSDecimalNumbersBehaviors protocol.
let dn3 = dn1.decimalNumberByAdding(dn2, withBehavior: self)
// Return nil if a bad exception happened, otherwise return the result
// of the add.
return badException ? nil : dn3
}
}
답변 해 주셔서 감사합니다. 이것은 좋은 해결책 인 것 같습니다. 지금 시도해 볼 것입니다. –
흠, # 1과 # 2에서 nil을 반환하기 전에 (추가 기능에서) 오류를 확인하는 방법은 무엇입니까? - 이것이 내가 오버플로에 대한 수표를 원하지만 서클에서 시작되는 크래시를 포함하지 않는 서클의 시작으로 이끄는 것 같습니다 (스위프트에서). –
오버 플로우는'a + b> maxint' 때 발생합니다. 양쪽에서'b'를 빼면'a> maxint-b'가됩니다. 이 경우'nil '을 리턴하십시오. 그것은 정수형을위한 것이지만 아이디어를 얻습니다. – vacawama