mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
The name was not only long and unwieldy, but inconsistent with our conscious decision to avoid the use of "elements" in APIs as mostly redundant. Swift SVN r22408
179 lines
4.7 KiB
Swift
179 lines
4.7 KiB
Swift
// RUN: %target-run-simple-swift | FileCheck %s
|
|
|
|
import Foundation
|
|
|
|
struct State {
|
|
let name: String
|
|
let population: Int
|
|
let abbrev: String
|
|
}
|
|
|
|
func stateFromPlistLame(plist: Dictionary<String, AnyObject>) -> State? {
|
|
if let name = plist["name"] as? NSString {
|
|
if let population = plist["population"] as? NSNumber {
|
|
if let abbrev = plist["abbrev"] as? NSString {
|
|
if abbrev.length == 2 {
|
|
return State(name: name,
|
|
population: population.integerValue,
|
|
abbrev: abbrev)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func stateFromPlistCool(plist: Dictionary<String, AnyObject>) -> State? {
|
|
switch (plist["name"], plist["population"], plist["abbrev"]) {
|
|
case let (name as String, pop as Int, abbr as String)
|
|
where count(abbr) == 2:
|
|
return State(name: name,
|
|
population: pop,
|
|
abbrev: abbr)
|
|
default:
|
|
return nil
|
|
}
|
|
}
|
|
|
|
let goodStatePlist: Dictionary<String, AnyObject> = [
|
|
"name": "California",
|
|
"population": 38_040_000,
|
|
"abbrev": "CA",
|
|
]
|
|
let invalidStatePlist1: Dictionary<String, AnyObject> = [
|
|
"name": "California",
|
|
"population": "hella",
|
|
"abbrev": "CA",
|
|
]
|
|
let invalidStatePlist2: Dictionary<String, AnyObject> = [
|
|
"name": "California",
|
|
"population": 38_040_000,
|
|
"abbrev": "Cali",
|
|
]
|
|
let invalidStatePlist3: Dictionary<String, AnyObject> = [
|
|
"name": "California",
|
|
"population": 38_040_000,
|
|
]
|
|
|
|
// CHECK-LABEL: Some:
|
|
// CHECK: name: California
|
|
// CHECK: population: 38040000
|
|
// CHECK: abbrev: CA
|
|
dump(stateFromPlistLame(goodStatePlist))
|
|
// CHECK-LABEL: Some:
|
|
// CHECK: name: California
|
|
// CHECK: population: 38040000
|
|
// CHECK: abbrev: CA
|
|
dump(stateFromPlistCool(goodStatePlist))
|
|
// CHECK-LABEL: nil
|
|
dump(stateFromPlistLame(invalidStatePlist1))
|
|
// CHECK-LABEL: nil
|
|
dump(stateFromPlistCool(invalidStatePlist1))
|
|
// CHECK-LABEL: nil
|
|
dump(stateFromPlistLame(invalidStatePlist2))
|
|
// CHECK-LABEL: nil
|
|
dump(stateFromPlistCool(invalidStatePlist2))
|
|
// CHECK-LABEL: nil
|
|
dump(stateFromPlistLame(invalidStatePlist3))
|
|
// CHECK-LABEL: nil
|
|
dump(stateFromPlistCool(invalidStatePlist3))
|
|
|
|
struct Country {
|
|
let name: String
|
|
let population: Int
|
|
}
|
|
|
|
enum Statistic: Reflectable {
|
|
case ForState(State)
|
|
case ForCountry(Country)
|
|
|
|
func getMirror() -> MirrorType {
|
|
return StatMirror(_value: self)
|
|
}
|
|
}
|
|
|
|
struct StatMirror: MirrorType {
|
|
let _value: Statistic
|
|
|
|
var value: Any { return _value }
|
|
var valueType: Any.Type { return value.dynamicType }
|
|
var objectIdentifier: ObjectIdentifier? { return nil }
|
|
var count: Int { return 1 }
|
|
|
|
subscript(i: Int) -> (String, MirrorType) {
|
|
assert(i == 0)
|
|
switch _value {
|
|
case .ForState(let state):
|
|
return ("State", reflect(state))
|
|
case .ForCountry(let country):
|
|
return ("Country", reflect(country))
|
|
}
|
|
}
|
|
|
|
var summary: String {
|
|
switch _value {
|
|
case .ForState:
|
|
return "State"
|
|
case .ForCountry:
|
|
return "Country"
|
|
}
|
|
}
|
|
|
|
var quickLookObject: QuickLookObject? { return nil }
|
|
var disposition: MirrorDisposition { return .Enum }
|
|
}
|
|
|
|
func statisticFromPlist(plist: Dictionary<String, AnyObject>) -> Statistic? {
|
|
switch (plist["kind"], plist["name"], plist["population"], plist["abbrev"]) {
|
|
case let ("state" as String, name as String, population as Int, abbrev as String)
|
|
where count(abbrev) == 2:
|
|
return Statistic.ForState(State(name: name,
|
|
population: population,
|
|
abbrev: abbrev))
|
|
case let ("country" as String, name as String, population as Int, .None):
|
|
return Statistic.ForCountry(Country(name: name,
|
|
population: population))
|
|
default:
|
|
return nil
|
|
}
|
|
}
|
|
|
|
let goodStatePlist2: Dictionary<String, AnyObject> = [
|
|
"kind": "state",
|
|
"name": "California",
|
|
"population": 38_040_000,
|
|
"abbrev": "CA"
|
|
]
|
|
let goodCountryPlist: Dictionary<String, AnyObject> = [
|
|
"kind": "country",
|
|
"name": "India",
|
|
"population": 1_23_70_00_000,
|
|
]
|
|
let invalidCountryPlist1: Dictionary<String, AnyObject> = [
|
|
"kind": "country",
|
|
"name": "India",
|
|
"population": 1_23_70_00_000,
|
|
"abbrev": "IN"
|
|
]
|
|
let invalidCountryPlist2: Dictionary<String, AnyObject> = [
|
|
"kind": "country",
|
|
"name": "India",
|
|
"population": "123 crore",
|
|
]
|
|
let invalidKindPlist: Dictionary<String, AnyObject> = [
|
|
"kind": "planet",
|
|
"name": "Mercury",
|
|
"population": 0
|
|
]
|
|
|
|
// CHECK-LABEL: Some: State
|
|
dump(statisticFromPlist(goodStatePlist2))
|
|
// CHECK-LABEL: Some: Country
|
|
dump(statisticFromPlist(goodCountryPlist))
|
|
// CHECK-LABEL: nil
|
|
dump(statisticFromPlist(invalidCountryPlist1))
|
|
// CHECK-LABEL: nil
|
|
dump(statisticFromPlist(invalidCountryPlist2))
|
|
// CHECK-LABEL: nil
|
|
dump(statisticFromPlist(invalidKindPlist))
|