Spec-Zone .ru
спецификации, руководства, описания, API

Библиотека разработчика XCode

Разработчик

Используя Swift с какао и Objective C

iBook
На этой странице

Принятие шаблонов разработки какао

Одно средство в записи хорошо разработанных, эластичных приложений состоит в том, чтобы использовать установленные шаблоны разработки Какао. Многие из этих образцов полагаются на классы, определенные в Objective C. Из-за функциональной совместимости Swift с Objective C можно использовать в своих интересах эти общие образцы в Коде SWIFT. Во многих случаях можно использовать функции языка Swift, чтобы расширить или упростить существующие образцы Какао, делая их более мощными и проще использовать.

Делегация

И в Swift и в Objective C, делегация часто выражается протоколом, определяющим взаимодействие и соответствующее свойство делегата. Так же, как в Objective C перед отправкой сообщения, что делегат может не ответить на, Вы спрашиваете делегата, реагирует ли он на селектор. В Swift можно использовать дополнительное объединение в цепочку для вызова дополнительного метода протокола на возможно nil возразите и разверните возможное использование результата if–let синтаксис. Листинг кода ниже иллюстрирует следующий процесс:

  1. Проверьте это myDelegate не nil.

  2. Проверьте это myDelegate реализует метод window:willUseFullScreenContentSize:.

  3. Если 1 и 2 сохраняются, вызовите метод и присвойте результат метода к названному значению fullScreenSize.

  4. Распечатайте возвращаемое значение метода.

Swift

  • class MyDelegate: NSObject, NSWindowDelegate {
  • func window(NSWindow, willUseFullScreenContentSize proposedSize: NSSize) -> NSSize {
  • return proposedSize
  • }
  • }
  • var myDelegate: NSWindowDelegate? = MyDelegate()
  • if let fullScreenSize = myDelegate?.window?(myWindow, willUseFullScreenContentSize: mySize) {
  • println(NSStringFromSize(fullScreenSize))
  • }

Сообщение об ошибке

Сообщение об ошибке в Swift следует за тем же образцом, который это делает в Objective C с дополнительным преимуществом предложения дополнительных возвращаемых значений. В самом простом случае Вы возвращаете a Bool значение от функции, чтобы указать, успешно выполнилось ли это. Когда необходимо сообщить о причине ошибки, можно добавить к функции NSError параметр типа NSErrorPointer. Этот тип примерно эквивалентен Objective C NSError **, с дополнительной безопасностью памяти и дополнительным вводом. Можно использовать префикс & оператор для передачи в ссылке на дополнительное NSError введите как NSErrorPointer объект, как показано в листинге кода ниже.

Swift

  • var writeError: NSError?
  • let written = myString.writeToFile(path, atomically: false,
  • encoding: NSUTF8StringEncoding,
  • error: &writeError)
  • if !written {
  • if let error = writeError {
  • println("write failure: \(error.localizedDescription)")
  • }
  • }

Когда Вы реализуете свои собственные функции, которые должны сконфигурировать NSErrorPointer объект, Вы устанавливаете NSErrorPointer объект memory свойство к NSError объект Вы создаете. Удостоверьтесь, что Вы проверяете, что вызывающая сторона передала не -nil NSErrorPointer объект сначала:

Swift

  • func contentsForType(typeName: String!, error: NSErrorPointer) -> AnyObject! {
  • if cannotProduceContentsForType(typeName) {
  • if error {
  • error.memory = NSError(domain: domain, code: code, userInfo: [:])
  • }
  • return nil
  • }
  • // ...
  • }

Наблюдение значения ключа

Наблюдение значения ключа является механизмом, позволяющим объектам быть уведомленными относительно изменений в указанных свойствах других объектов. Можно использовать наблюдение значения ключа с классом Swift, пока класс наследовался от NSObject класс. Можно использовать эти три шага для реализации наблюдения значения ключа в Swift.

  1. Добавьте dynamic модификатор к любому свойству Вы хотите наблюдать. Для получения дополнительной информации о dynamic, посмотрите Требующую Динамическую Отгрузку.

    Swift

    • class MyObjectToObserve: NSObject {
    • dynamic var myDate = NSDate()
    • func updateDate() {
    • myDate = NSDate()
    • }
    • }
  2. Создайте глобальную переменную контекста.

    Swift

    • private var myContext = 0
  3. Добавьте наблюдателя для ключевого пути, переопределите observeValueForKeyPath:ofObject:change:context: метод, и удаляет наблюдателя в deinit.

    Swift

    • class MyObserver: NSObject {
    • var objectToObserve = MyObjectToObserve()
    • override init() {
    • super.init()
    • objectToObserve.addObserver(self, forKeyPath: "myDate", options: .New, context: &myContext)
    • }
    • override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject: AnyObject], context: UnsafeMutablePointer<Void>) {
    • if context == &myContext {
    • println("Date changed: \(change[NSKeyValueChangeNewKey])")
    • } else {
    • super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
    • }
    • }
    • deinit {
    • objectToObserve.removeObserver(self, forKeyPath: "myDate", context: &myContext)
    • }
    • }

Действие Target

Действие Target является общим шаблоном разработки Какао, в котором объект отправляет сообщение в другой объект, когда определенное событие имеет место. Модель целевого действия существенно подобна в Swift и Objective C. В Swift Вы используете Selector введите для обращения к селекторам Objective C. Для примера использования целевого действия в Коде SWIFT посмотрите Селекторы Objective C.

Самоанализ

В Objective C Вы используете isKindOfClass: метод, чтобы проверить, является ли объект определенный тип класса, и conformsToProtocol: метод, чтобы проверить, соответствует ли объект указанному протоколу. В Swift Вы выполняете эту задачу при помощи is оператор для проверки на тип, или as? оператор к нисходящему к тому типу.

Можно проверить, имеет ли экземпляр определенный тип подкласса при помощи is оператор. is оператор возвращается true если экземпляр имеет тот тип подкласса, и false если это не.

Swift

  • if object is UIButton {
  • // object is of type UIButton
  • } else {
  • // object is not of type UIButton
  • }

Можно также попытаться нисходящие к типу подкласса при помощи as? оператор. as? оператор возвращает дополнительное значение, которое может быть связано с постоянным использованием if-let оператор.

Swift

  • if let button = object as? UIButton {
  • // object is successfully cast to type UIButton and bound to button
  • } else {
  • // object could not be cast to type UIButton
  • }

Для получения дополнительной информации посмотрите Преобразование типа в Swift Язык программирования.

Проверка и бросок к протоколу следуют точно за тем же синтаксисом как проверяющий на и бросающий к классу. Вот пример использования as? оператор для проверки на соответствие протокола:

Swift

  • if let dataSource = object as? UITableViewDataSource {
  • // object conforms to UITableViewDataSource and is bound to dataSource
  • } else {
  • // object not conform to UITableViewDataSource
  • }

Обратите внимание на то, что после этого броска, dataSource постоянный имеет тип UITableViewDataSource, таким образом, можно только вызвать методы и свойства доступа, определенные на UITableViewDataSource протокол. Необходимо бросить его назад к другому типу для выполнения других операций.

Для получения дополнительной информации см. Протоколы в Swift Язык программирования.