| // RUN: %target-run-simple-swift | %FileCheck %s |
| // REQUIRES: executable_test |
| |
| // REQUIRES: objc_interop |
| |
| import Foundation |
| |
| struct State { |
| let name: String |
| let population: Int |
| let abbrev: String |
| } |
| |
| func stateFromPlistLame(_ plist: Dictionary<String, Any>) -> 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 as String, |
| population: population.intValue, |
| abbrev: abbrev as String) |
| } |
| } |
| } |
| } |
| return nil |
| } |
| |
| func stateFromPlistCool(_ plist: Dictionary<String, Any>) -> State? { |
| switch (plist["name"], plist["population"], plist["abbrev"]) { |
| case let (name as String, pop as Int, abbr as String) |
| where abbr.count == 2: |
| return State(name: name, |
| population: pop, |
| abbrev: abbr) |
| default: |
| return nil |
| } |
| } |
| |
| let goodStatePlist: Dictionary<String, Any> = [ |
| "name" as String: "California", |
| "population" as String: 38_040_000, |
| "abbrev" as String: "CA", |
| ] |
| let invalidStatePlist1: Dictionary<String, Any> = [ |
| "name": "California", |
| "population": "hella", |
| "abbrev": "CA", |
| ] |
| let invalidStatePlist2: Dictionary<String, Any> = [ |
| "name": "California", |
| "population": 38_040_000, |
| "abbrev": "Cali", |
| ] |
| let invalidStatePlist3: Dictionary<String, Any> = [ |
| "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 : CustomReflectable { |
| case ForState(State) |
| case ForCountry(Country) |
| |
| var customMirror: Mirror { |
| switch self { |
| case .ForState(let state): |
| return Mirror( |
| self, children: ["State": state], displayStyle: .`enum`) |
| case .ForCountry(let country): |
| return Mirror( |
| self, children: ["Country": country], displayStyle: .`enum`) |
| } |
| } |
| } |
| |
| func statisticFromPlist(_ plist: Dictionary<String, Any>) -> 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 abbrev.count == 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, Any> = [ |
| "kind": "state", |
| "name": "California", |
| "population": 38_040_000, |
| "abbrev": "CA" |
| ] |
| let goodCountryPlist: Dictionary<String, Any> = [ |
| "kind": "country", |
| "name": "India", |
| "population": 1_23_70_00_000, |
| ] |
| let invalidCountryPlist1: Dictionary<String, Any> = [ |
| "kind": "country", |
| "name": "India", |
| "population": 1_23_70_00_000, |
| "abbrev": "IN" |
| ] |
| let invalidCountryPlist2: Dictionary<String, Any> = [ |
| "kind": "country", |
| "name": "India", |
| "population": "123 crore", |
| ] |
| let invalidKindPlist: Dictionary<String, Any> = [ |
| "kind": "planet", |
| "name": "Mercury", |
| "population": 0 |
| ] |
| |
| // CHECK-LABEL: ▿ Optional(main.Statistic.ForState(main.State(name: "California", population: 38040000, abbrev: "CA"))) |
| dump(statisticFromPlist(goodStatePlist2)) |
| // CHECK-LABEL: ▿ Optional(main.Statistic.ForCountry(main.Country(name: "India", population: 1237000000))) |
| dump(statisticFromPlist(goodCountryPlist)) |
| // CHECK-LABEL: nil |
| dump(statisticFromPlist(invalidCountryPlist1)) |
| // CHECK-LABEL: nil |
| dump(statisticFromPlist(invalidCountryPlist2)) |
| // CHECK-LABEL: nil |
| dump(statisticFromPlist(invalidKindPlist)) |