因此,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
为什么?
我没有充分的理由,我只是在试验这门语言。
答案 0 :(得分:17)
幸运的是,您可以使用if case
:
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);