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

Log*_*gan 12 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)")
}
Run Code Online (Sandbox Code Playgroud)

是否有可能在switch声明之外解开这些内在价值?就像是:

var addressStr = address.0
Run Code Online (Sandbox Code Playgroud)

为什么?

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

Qby*_*yte 17

幸运的是,你可以在Swift 2中使用if case:

if case .Address(let addressString) = address {
    // do something with addressString
}
Run Code Online (Sandbox Code Playgroud)

  • 你也可以这样做作为一个守卫:`guard case .Address(let addressString)= address else {...}` (3认同)

Aus*_*tin 14

编辑:现在可以在Swift 2+中使用/sf/answers/2189071601/


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

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)
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

var addressStr = address.address
Run Code Online (Sandbox Code Playgroud)