В попытке подсластить пилюлю нам дали Optional Binding. Это позволяет на лету присвоить в переменную/константу значение опционала и в зависимости от того содержался там nil или нормальное значение выполнить нужную ветку кода
|
var someOptional : Int? = 3 if let constantName = someOptional { print(constantName) } else { print("nil") } |
Мы на лету перобразовываем Int? к Int и внутри скобок уже пользуемся constantName как обычным Int, без приведения Ну и в Swift 1.2, нам позволили делать присваивания… Читать далее »
Главный “pain in ass” – optionals, или как же было просто с nil в Objective-c В Objective-C если у обьекта отсутствовало значение – мы ему просто присваивали nil. Но для тех же структур или enum’ов приходилось использовать спец значения типа NSNotFound чтобы указать что значение отсутствует Swift же позволяет указать отсутствие значения для любого типа, даже базового типа Int. Достигается… Читать далее »
Теперь легко на лету сформировать возвращаемое значение состоящее из данных любых типов Особенно полезно, если функция должна вернуть несколько значений
|
func minMax(array: [Int]) -> (min: Int, max: Int) { var currentMin = Int.max var currentMax = Int.min for value in array { if value < currentMin { currentMin = value } if value > currentMax { currentMax = value } } return (currentMin, currentMax) } |
(min: Int, max: Int) – и есть кортеж, состоящий из двух целых чисел Теперь мы можем обратиться к answer.min и answer.max, но это лишь в случае если были указаны имена в определении кортежа, т.е. (min: Int, max: Int) а… Читать далее »
При формировании строки допускается интерполяция строк (string interpolation), позволяющая формировать строку используя переменные. В отличии от objective-C переменные вставляются более наглядно. Делается это с помощью конструкции – \(ИмяПеременной) Было
|
NSString *str = [NSString stringWithFormat:@"%@ = %d", s, num]; |
Стало
|
var str = "\(s) = \(num)" |
Также поддерживаются вычисления на месте
|
let multiplier = 3 let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)" // message = 3 times 2.5 is 7.5 |
Основное отличие в том, что 1 более не равна true, т.е.
выдаст ошибку, т.к. Bool теперь структура
|
var bool : Bool = false bool = 1 // ошибка |
При определении переменных var и констант let тип определяется автоматически, если не указывать явно
|
let implicitFloatConstant = 10.0 // константа double 10.0 var implicitIntegerVar = 0 // переменная int 0 var explicitFloatVar : Float = 0 // переменная float 0.0, тип указан явно |
Честно говоря мне до сих пор тяжело привыкнуть начинать определение переменной/константы не с типа, а с var/let. Но это дело времени, хотя указанный тип в начале определения переменной на мой взгляд довольно полезен пр беглом просмотре кода.
Данная статья изначально задумывалась как выборка самых интересных и неявных моментов выявленных во время прочтения официальной книги по Swift от Apple – “The Swift Programming Language“, но в процессе написания все больше приходило понимание, что будет крайне тяжело решить что оставить, а что выкинуть из описания языка. С другой стороны некоторые моменты хотелось дать более развернуто, некоторые исходные коды сделать… Читать далее »