在Swift中打开Switch外部的Enum元组

时间:2014-06-04 00:46:31

标签: swift

因此,Swift中一个很酷的新功能是更高级enum,并且可以关联更复杂的数据。例如,我可以这样做:

enum Location {
    case GeoPoint(latitude: Double, longitude: Double)
    case Address(address: String)
}

var address = Location.Address(address: "1234 Fake St, Fakesville TN, 41525")
var geoPoint = Location.GeoPoint(latitude: 42.342, longitude: -32.998)

// address or geoPoint
switch address {
case .Address(let addressStr):
    // Unwrapped value as 'addressStr'
    println("Address: \(addressStr)")
case .GeoPoint(let latitude, let longitude):
    // Unwrapped values as 'latitude' and 'longitude'
    println("lat: \(latitude) long: \(longitude)")
}

是否可以在switch语句之外解包这些内部值?类似的东西:

var addressStr = address.0

为什么?

我没有充分的理由,我只是在试验这门语言。

3 个答案:

答案 0 :(得分:17)

幸运的是,您可以使用if case

在Swift 2中执行此操作
if case .Address(let addressString) = address {
    // do something with addressString
}

答案 1 :(得分:14)

编辑:现在可以在Swift 2 + https://stackoverflow.com/a/31272451/308315

中使用

我不认为这是可能的,因为枚举变量不能保证是那些内部值的情况。您可以添加一个计算属性,为您解包它:

enum Location {

    var address: String? {
    get {
        switch self {
        case .Address(let address)
            return address
        default:
            return nil
        }
    }
    }

    case GeoPoint(latitude: Double, longitude: Double)
    case Address(address: String)
}

然后你可以这样做:

var addressStr = address.address

答案 2 :(得分:3)

我认为你在查看枚举是错误的。枚举类型只能是其中一个值。在这种情况下,位置只能是GeoPoint或地址,而不是两者。 switch语句确定它是哪一个。我认为您在这里寻找的功能是这样的结构:

struct Geopoint{
    var longitude : Double = 0.0
    var latitude : Double = 0.0
}
struct Location{
    var address : String = ""
    var geopoint: Geopoint
}

然后,您可以创建Location的新实例并访问其属性。

var location = Location(address: "1 Example Street ...", geopoint:Geopoint(longitude: 12.2, latitude: 53.2))

println(location.address);