Инициализаторы в Objective-C имеют вид initИмяПеременной или initWithИмяПеременной В swift метод должен называться именно init, поэтому With если есть удаляется, а ИмяПеременной переходит в качестве имени первого параметра метода init Было
|
UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped]; |
Стало
|
let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped) |
Вызывать alloc больше не нужно. Для удобства фабричные методы Objectve-C соотнесли с соответствующими init методами Swift
|
UIColor *color = [UIColor colorWithRed:0.5 green:0.0 blue:0.5 alpha:1.0]; |
|
let color = UIColor(red: 0.5, green: 0.0, blue: 0.5, alpha: 1.0) |
По умолчанию инициализаторы из Objective-C транслируются в swift… Читать далее »
Подразделы: Как использовать совместно Objective-C и swift из одного Framework Target При использовании swift из Objective-C мы не можем пользоваться специфическими фишками языка swift Naming Your Product Module (именование модуля продукта) Подводные камни Как использовать совместно Objective-C и swift из одного App Target Если мы пишем обычное приложение и хотим сделать импорт Objective-C для работы в swift необходимо создать Objective-C… Читать далее »
Теперь мы всегда в runtime узнать на какой именно платформе мы запущены и применить специфические функции в случае если они доступны с помощью #available
|
if #available (iOS 9, OSX 10.10, *) { // 1 //код специфичный для этих платформ } else if #available (iOS 8.3, watchOS 2.0, *) { //код специфичный для iOS8 } else { } |
Доступны проверки для iOS, OSX, watchOS, iOSApplicationExtension, OSXApplicationExtension Звездочка обязательна, она означает что этот код будет доступен не только для указанных платформ но и для будущих (иначе после каждого релиза ОС пришлось бы добавлять новые… Читать далее »
В Swift 2.0 наконец добавили обработку ошибок. Для представления ошибок добавили протокол ErrorType. В основном для создания своих ошибок создают перечисление реализующее этот протокол
|
enum FileReadError : ErrorType { case EmptyName case NoRights(owner: String) } |
При чтении файла допустим мы будем обрабатывать 2 ситуации, пустой путь и отстутствие прав на чтение (needUser будет указывать учетную запись владельца файла) Чтобы обозначить, что функция/метод могут выбрасывать ошибки наружу – ввели ключевое слово… Читать далее »
Мы можем определить абсолютно новые операторы (подробней по разрешенным символам для названия оператора лучше смотреть в документации) Требования те же что и к переопределенным, нужно определять на глобальном уровне, можно использовать модификаторы prefix, infix или postfix К примеру пусть будет оператор +++ удваивающий вектор. Сначала определим сам оператор
А затем конкретную функцию его реализующую
|
prefix func +++ (inout vector: Vector2D) -> Vector2D { vector += vector return vector } var toBeDoubled = Vector2D(x: 1.0, y: 4.0) let afterDoubling = +++toBeDoubled // оба и toBeDoubled и afterDoubling теперь равны (2.0, 8.0) |
Для наших новых infix… Читать далее »
Мы можем переназначать для структур и классов операторы +, –, и т.д.
|
struct Vector2D { var x = 0.0, y = 0.0 } func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y) } |
Обратим внимание, что функция определена не внутри структуры, а определена как глобальная Это позволит нам беспроблемно складывать векторы.
|
let vector = Vector2D(x: 3.0, y: 1.0) let anotherVector = Vector2D(x: 2.0, y: 4.0) let combinedVector = vector + anotherVector |
оператор + инфиксный и бинарный (должен находиться между двух операндов) Так же можно переопределить унарные операторы, например ++ или —. Причем как префиксные -a, так и постфиксные a++…. Читать далее »
У операторов существует приоритет, на основании которого решается какой оператор будет выполнен первым (например умножение выполнится раньше сложения) Если же приоритет равен рассматривается ассоциативность, определяющая как операторы группируются – слева или справа Например это выражение равно 4 2 + 3 * 4 % 5 Но если бы мы не следовали приоритетам наши шаги были бы следующие 2 + 3 =… Читать далее »
Основное отличие от C – арифметически операции в Swift выполняются без переполнения, чтобы переполнение было, – необходимо перед оператором поставить знак амперсанда & (&+ к примеру) Т.е. по умолчанию при переполнении swift выкидывает ошибку и выполнение программы прерывается.
|
var potentialOverflow = Int16.max // potentialOverflow равен 32767, что максимально допустимое значение для типа Int16 potentialOverflow += 1 // выполнение этой строки вызовет ошибку |
Чтобы избежать ошибки надо использовать операторы переполнения – сложение &+ – вычитание &- – умножение &* Переполнение может случиться как в… Читать далее »
– оператор NOT (логическое НЕ, инвертирует все биты, ~)
|
00001111 ~ 11110000 let initialBits: UInt8 = 0b00001111 let invertedBits = ~initialBits // 11110000 |
UInt8 – целые беззнаковые числа в диапазоне от 0 до 255 – оператор AND (логическое И, выдаст 1, если оба бита = 1, &)
|
11111100 & 00111100 -------- 00111100 let firstSixBits: UInt8 = 0b11111100 let lastSixBits: UInt8 = 0b00111111 let middleFourBits = firstSixBits & lastSixBits // 00111100 |
– оператор OR (логическое ИЛИ, выдаст 1 если хоть один бит = 1, ||)
|
10110010 || 11111110 -------- 11111110 let someBits: UInt8 = 0b10110010 let moreBits: UInt8 = 0b01011110 let combinedbits = someBits | moreBits // 11111110 |
– оператор XOR (логическоле ИЛИ-НЕ, выдаст 1 если биты разные,… Читать далее »
Мы будем называть все к чему можно применить контроль доступа – записи (entries) Контроль доступа ограничивает доступ к указанным записям в других исходных файлах и модулях. Уровень доступа можно назначить как типам, так и их членам. Существует так же права доступа по умолчанию, чтобы не приходилось их выставлять для всех членов. Уровень по умолчанию – internal Модуль – отдельная единица… Читать далее »