10. Optional
guard let y = x { ... }
//
let image = UIImage(named: "Background") if image == nil {
print("Image not loaded ")
return
}
let size = image!.frame.size.scaled(by: 2.0)
//
let image = UIImage(named: selectedImageName)!
guard let x = x { ... }
//
guard let image = image else {
print("Image not loaded"); return
}
let size = image.size.scaled(by: 2.0)
//
guard let image = UIImage(named: selectedImageName)
else { preconditionFailure("Missing (selectedImageName)
asset") }
11. IUO
class Company {
let name: String
var ceo: CEO!
init(name: String, ceoName: String) {
self.name = name
self.ceo = CEO(name: ceoName, company: self)
}
}
class CEO {
let name: String
unowned let company: Company
init(name: String, company: Company) {
self.name = name
self.company = company
}
}
let company = Company(name: "HK", ceoName: "Min")
12. Enum Associated Value
enum JSONData {
case null
case bool(Bool)
case number(Double)
case string(String)
case array([JSONData])
case object([String: JSONData])
var string: String? {
guard case .string(let s) = self else { return nil }
return s
}
var array: [JSONData]? {
guard case .array(let a) = self else { return nil }
return a
}
var object: [String: JSONData]? {
guard case .object(let o) = self else { return nil }
return o
}
}
case bool(boolValue: Bool)
case number(numberValue: Double)X
13. Enum Error
enum Error: String, Error {
case invalidFormat = " ."
case quit = " ."
case notFound = " ."
}
enum MenuError: Error {
case invalidFormat
case quit
case notFound
var localizedDescription: String {
switch self {
case .invalidInput:
return " ."
case .quit:
return " ."
case .notFound:
return " ."
}
}
}
✱
✱
✱
14. Type Casting conditionally
var dict: [AnyHashable: Any] = [:]
dict["age"] = 33
if let anyValue = dict[“age"],
anyValue is Int
{
let intValue = anyValue as! Int
//
}
guard let intValue = dict[“age"] as? Int else { return }
let wrappedValue: AnyHashable? = "value" // typed AnyHashable?
let unwrappedValue: AnyHashable = "value" // typed AnyHashable
let optString1 = unwrappedValue as? String // typed String?
let optString2 = wrappedValue as? String // typed String?
let veryOptyString: String???????????? = optString2 // Typed String????????????
let lessOptyString: String??? = veryOptyString // Error!