处理多个可选变量?

时间:2015-03-20 08:42:39

标签: swift

我在处理代码中的多个选项以及相应的错误处理方面遇到了很好的模式。

Hava看看下面的例子

func getCoordinates1(pLatitude: Double?, pLongitude: Double?) -> CLLocationCoordinate2D?{
    var coord:CLLocationCoordinate2D?

    if let latitude = pLatitude {
        if let longitude = pLongitude {
            coord = CLLocationCoordinate2DMake(lat, long)
        }
    }

    return coord
}

这看起来很好,但在现实世界中,您可能需要一些错误处理,在这里我正在寻找一种不用重复代码写下来的好方法:

func getCoordinates2(pLatitude: Double?, pLongitude: Double?) -> CLLocationCoordinate2D? {
    var coord:CLLocationCoordinate2D?

    if let latitude = pLatitude {
        if let longitude = pLongitude {
            coord = CLLocationCoordinate2DMake(latitude, longitude)
        } else {
            // do something to catch the error
        }
    } else {
        // do the same as above (duplicate code)
    }

    return coord
}

我有时会做的是使用布尔来跟踪它:

func getCoordinates3(pLatitude: Double?, pLongitude: Double?) -> CLLocationCoordinate2D? {
    var coord:CLLocationCoordinate2D?
    var success = false

    if let latitude = pLatitude {
        if let longitude = pLongitude {
            coord = CLLocationCoordinate2DMake(latitude, longitude)
            success = true
        }
    }
    if !success {
        // do something to catch the error
    }
    return coord
}

或者我使用早退出的模式,但我认为这也是错误的

func getCoordinates4(pLatitude: Double?, pLongitude: Double?) -> CLLocationCoordinate2D? {

    if let latitude = pLatitude {
        if let longitude = pLongitude {
            return CLLocationCoordinate2DMake(latitude, longitude)
        }
    }
    // do something to catch the error

    return nil
}

当然这是一个只有两个选项的条带化示例,但是在解析json时,更多级联 - 如果可能是必要的话。我希望这个想法和问题是清楚的。

2 个答案:

答案 0 :(得分:2)

正如评论中所提到的,在 Swift 1.2 中,您将能够做到这一点:

func getCoordinates2(pLatitude: Double?, pLongitude: Double?) -> CLLocationCoordinate2D? {
    var coord:CLLocationCoordinate2D?

    if let latitude = pLatitude, longitude = pLongitude {
        coord = CLLocationCoordinate2DMake(latitude, longitude)
    } else {
        // do something to catch the error
    }

    return coord
}

我建议您构建代码,以便在可用时更容易切换到该样式。

试试这个:

func getCoordinates2(pLatitude: Double?, pLongitude: Double?) -> CLLocationCoordinate2D? {
    var coord:CLLocationCoordinate2D?

    if pLatitude != nil && pLongitude != nil {
        let latitude = pLatitude!
        let longitude = pLongitude!
        coord = CLLocationCoordinate2DMake(latitude, longitude)
    } else {
        // do something to catch the error
    }

    return coord
}

这与Swift 1.2版本具有相同的语义和结构,当它可用时,您可以切换到更新的语法,而无需更改任何缩进。

答案 1 :(得分:0)

基本上你要做的事情可以分成两组操作:

  • 第一个是数据(有效载荷)的简单处理
  • 第二是处理潜在的错误情况

错误条件的处理始终是相同的,即检查上一个操作是否返回错误并将其传递给上游,如果到目前为止一切正常,则处理结果并继续成功。这可以很好地封装在一个函数中,该函数将结果和闭包作为输入并返回另一个结果。我认为来自Rob Napier的this blog-post对你非常有用。