Принятие шаблонов разработки какао
Одно средство в записи хорошо разработанных, эластичных приложений состоит в том, чтобы использовать установленные шаблоны разработки Какао. Многие из этих образцов полагаются на классы, определенные в Objective C. Из-за функциональной совместимости Swift с Objective C можно использовать в своих интересах эти общие образцы в Коде SWIFT. Во многих случаях можно использовать функции языка Swift, чтобы расширить или упростить существующие образцы Какао, делая их более мощными и проще использовать.
Делегация
И в Swift и в Objective C, делегация часто выражается протоколом, определяющим взаимодействие и соответствующее свойство делегата. Так же, как в Objective C перед отправкой сообщения, что делегат может не ответить на, Вы спрашиваете делегата, реагирует ли он на селектор. В Swift можно использовать дополнительное объединение в цепочку для вызова дополнительного метода протокола на возможно nil возразите и разверните возможное использование результата if–let синтаксис. Листинг кода ниже иллюстрирует следующий процесс:
Проверьте это
myDelegateнеnil.Проверьте это
myDelegateреализует методwindow:willUseFullScreenContentSize:.Если 1 и 2 сохраняются, вызовите метод и присвойте результат метода к названному значению
fullScreenSize.Распечатайте возвращаемое значение метода.
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.
Добавьте
dynamicмодификатор к любому свойству Вы хотите наблюдать. Для получения дополнительной информации оdynamic, посмотрите Требующую Динамическую Отгрузку.Swift
class MyObjectToObserve: NSObject {dynamic var myDate = NSDate()func updateDate() {myDate = NSDate()}}
Создайте глобальную переменную контекста.
Swift
private var myContext = 0
Добавьте наблюдателя для ключевого пути, переопределите
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 Язык программирования.
