在Swift中打开开关外部的枚举元组

在Swift中打开开关外部的枚举元组,swift,Swift,因此,Swift中的一个很酷的新功能是更高级的enums以及关联更复杂数据的可能性。例如,我可以这样做: enum Location { case GeoPoint(latitude: Double, longitude: Double) case Address(address: String) } var address = Location.Address(address: "1234 Fake St, Fakesville TN, 41525") var geoPoin

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

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)")
}
struct Geopoint{
    var longitude : Double = 0.0
    var latitude : Double = 0.0
}
struct Location{
    var address : String = ""
    var geopoint: Geopoint
}
是否可以在
开关
语句之外展开这些内部值?比如:

var addressStr = address.0
为什么?


我没有很好的理由,我只是在尝试这种语言

编辑:这在Swift 2+中现在是可能的


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

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

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

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)")
}
struct Geopoint{
    var longitude : Double = 0.0
    var latitude : Double = 0.0
}
struct Location{
    var address : String = ""
    var geopoint: Geopoint
}
然后可以创建
位置的新实例
并访问其属性

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

println(location.address);

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

if case .Address(let addressString) = address {
    // do something with addressString
}

对于一个“真正的”项目来说,这可能是一个更好的组织,好东西。我使用enum只是因为我对各种语言限制感到好奇。我的示例有点做作,因为我试图使用与apple文档中的UPC/QRCode示例不同的东西。只是为了让它看起来不像我在复制和粘贴,没有任何想法。感谢您提供的信息:)这个答案虽然不是对OP问题的回答,但它是一个重要的观点,即正确使用枚举类型。但是请注意,上面的代码不是可编译的Swift代码。@mbeaty我很抱歉。我在进入操场环境之前写下了这个答案。我已经更新了答案。您也可以作为一个守卫来执行此操作:
guard case.Address(let addressString)=Address else{…}