swift, основы (в разрезе enums)

18
Swift основы Королев Юрий AnjLab г. Владимир

Upload: anjlab

Post on 15-Apr-2017

428 views

Category:

Software


6 download

TRANSCRIPT

Page 1: Swift, основы (в разрезе Enums)

Swiftосновы

Королев Юрий AnjLab

г. Владимир

Page 2: Swift, основы (в разрезе Enums)

Enum

enum Example { case A case B case C case D}

Page 3: Swift, основы (в разрезе Enums)

Enum и ассоциированные значения

enum JSValue { case Obj([String: JSValue]) case Num(Number) case Arr([JSValue]) case Str(String) case Null case True case False}

// Examplelet jsonString = JSValue.Str(“Hello”)

Page 4: Swift, основы (в разрезе Enums)

Как работать - Pattern matching

switch jsonString {case let .Str(value): print(value)default: break}

// Swift 2.0 или 1.2 - не важно :)if case let .Str(value) = jsonString { print(value)}

Page 5: Swift, основы (в разрезе Enums)

Generic Enums

enum Box<T> { case empty case filledWith(T)}

let emptyBox:Box<Int> = Box.emptylet filledBox:Box<Int> = Box.filledWith(5)

Page 6: Swift, основы (в разрезе Enums)

значения не могут быть nil

Page 7: Swift, основы (в разрезе Enums)

Проверка на этапе компиляции

// Swiftfunc alert(message: String) { // No need to check message is nil // Do ...}

// C#void Alert(String message) { if (message == null) throw new ArgumentNullException("message");

// Do ...}

Page 8: Swift, основы (в разрезе Enums)

nil - это не значение, это литерал

// Wrapped!enum ImplicitlyUnwrappedOptional<Wrapped> : NilLiteralConvertible { case None case Some(Wrapped)}

// Wrapped?enum Optional<Wrapped> : NilLiteralConvertible { case None case Some(Wrapped)}

Page 9: Swift, основы (в разрезе Enums)

Optionals примерыlet o1:Optional<String> = Optional.Some("nice")let o2:Optional<String> = .Some("nice")let o3 = Optional.Some("nice")let o4:String? = Optional.Some("nice")let o5:String? = .Some("nice")let o6:String? = "nice"

let o7:Optional<String> = Optional.Nonelet o8:Optional<String> = .Nonelet o10:String? = Optional.Nonelet o11:String? = .Nonelet o12:String? = nil

Page 10: Swift, основы (в разрезе Enums)

Optionals примерыlet o1:ImplicitlyUnwrappedOptional<String> = ImplicitlyUnwrappedOptional.Some("nice")let o2:ImplicitlyUnwrappedOptional<String> = .Some("nice")let o3 = ImplicitlyUnwrappedOptional.Some("nice")let o4:String! = ImplicitlyUnwrappedOptional.Some("nice")let o5:String! = .Some("nice")let o6:String! = "nice"

let o7:ImplicitlyUnwrappedOptional<String> = Optional.Nonelet o8:ImplicitlyUnwrappedOptional<String> = .Nonelet o10:String! = ImplicitlyUnwrappedOptional.Nonelet o11:String! = .Nonelet o12:String! = nil

Page 11: Swift, основы (в разрезе Enums)

Optional может быть любой тип

Page 12: Swift, основы (в разрезе Enums)

Ошибки

func foo() -> Int { return 10}

Page 13: Swift, основы (в разрезе Enums)

Ошибки

enum Result<T> { case ok(T) case error(NSError)}

func foo() -> Result<Int> { // Ok return Result.ok(10) // Error return Result.error(NSError())}

Page 14: Swift, основы (в разрезе Enums)

Работа с ошибками в swiftfunc foo() -> Result<Int> { // Ok return Result.ok(10) // Error return Result.error(NSError())}

func foo() throws -> Int { // Ok return 10 // Error throw NSError()}

Page 15: Swift, основы (в разрезе Enums)

Вызов методов

// C#try {foo();bla();

}catch (Exception exception) { // …}

// Swiftdo {try foo()bla()

}catch let error { // …}

Page 16: Swift, основы (в разрезе Enums)

Вызов методов try?

let x = try? foo() // x:Int?

let x:Int?if case let Result.ok(value) = foo() { x = value} else { x = nil}

Page 17: Swift, основы (в разрезе Enums)

Вызов методов try!let x = try! foo() // x:Int or crash

let x: Intlet result = foo()

switch result {case let .ok(value): x = valuecase let .error(error): fatalError(error) // примерно так :)}

Page 18: Swift, основы (в разрезе Enums)

КонецВопросы?