为什么Swift不支持异常?

时间:2014-09-24 09:35:38

标签: ios swift

如我所知,斯威夫特并不支持异常。但我想知道为什么?实际上我需要有关以下场景的建议。

   public func get(pos : Int) -> Int
    {
        if pos >= length
        {
            // what should I do here?
            //throw OutsideBounds;
        }
        return _data.get(pos);
    }

如您所见,如果该位置大于 _data 的计数,我通常会抛出异常。但是我应该在Swift中做些什么呢?需要你的建议。感谢

3 个答案:

答案 0 :(得分:2)

如果在条件失败的情况下缺少值是一个很好的响应,那么您可以将返回类型转换为可选,并按如下方式实现该函数:

public func get(pos : Int) -> Int?
{
    if pos >= length {
        return .None
    }

    return _data.get(pos);
}

如果您需要返回有关错误的更多信息,例如作为NSError的实例,那么您可以创建一个可以包含值(称为Some)或错误的枚举(叫Error):

public enum RetVal {
    case Some(Int)
    case Error(NSError)
}

并将函数的实现更改为:

public func get(pos : Int) -> RetVal
{
    if pos >= length {
        return RetVal.Error(NSError(domain: "MyApp", code: 55, userInfo: nil))
    }

    return RetVal.Some(_data.get(pos));
}

并按如下方式使用:

let returnValue = get(55)
switch returnValue  {
case .Some(let value):
    println(value)
case .Error(let error):
    println(error)
}

这可以防止您忘记处理异常(例如在C#中)或使用catch es来污染代码,以防止函数/方法调用可能引发的任何异常(如在java中)。我一开始并不喜欢没有例外,但是现在我看到我的代码通过避免它们来更清晰。

答案 1 :(得分:2)

Swift支持可选类型,附加?的类型。这似乎是使用它们的正确案例。这意味着该方法可以返回和Int,或者在出现问题时,可以返回“非值”。

只需将该功能重写为

即可
public func get(pos : Int) -> Int?
    {
        if pos >= length
        {
            return nil
        }
        return _data.get(pos)
    }

如果方法调用者需要知道更多不同类型的错误,那么您可能需要一个更复杂的解决方案才能告诉调用者确切的问题是什么。

答案 2 :(得分:2)

我会在Swift中使用 Optional 功能并编写get方法,如:

var _data:Array<Int> = [1,2,3]
var length = _data.count

func get(pos : Int) -> Int?
{
    if pos >= length{
       return nil
    }

    return _data[pos]
}

// TEST
var value = get(2)  // {Some 3}
var value = get(10) // nil

所以下一步非常简单 - 打开它:

if let tempData = get(10){
   // success
}
else{
   // failure
}