Принятие шаблонов разработки какао
Одно средство в записи хорошо разработанных, эластичных приложений состоит в том, чтобы использовать установленные шаблоны разработки Какао. Многие из этих образцов полагаются на классы, определенные в 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 Язык программирования.