2015-07-14 2 views
1

Вот мой код:Issue наследовать UIAlertAction в Swift

class CustomAlertAction: UIAlertAction { 
    init(title : String) { 
     super.init(title: title, style: UIAlertActionStyle.Default) { (action) -> Void in 
     } 
    } 
} 

Но я получил следующее сообщение об ошибке компиляции:

Must call a designated initializer of the superclass 'UIAlertAction'

Я знаю, назначенный инициализатор UIAlertAction является Init(). Но init (заголовок, стиль, обработчик) UIAlert не будет вызывать назначенный инициализатор init()?

Любая идея? Благодаря

P.S .: На основании документа Apple:

A designated initializer must call a designated initializer from its immediate superclass.”

Означает ли это, он не имеет права наследовать UIAlertAction в Swift? Это не проблема в Objective-C.

Причина, по которой я хочу создать подкласс UIAlertAction, заключается в том, что я хочу добавить команду ReactiveCocoa в качестве действия.

+1

Почему вы думаете, что вам нужно создать подкласс UIAlertAction? – matt

+0

К сожалению, вы можете сделать обходной путь, см. Http://stackoverflow.com/a/25164687/95309 –

+1

«Причина, по которой я хочу создать подкласс UIAlertAction, заключается в том, что я хочу добавить команду ReactiveCocoa в качестве действия «И вы не можете сделать это с расширением? – matt

ответ

7

Решение реалистично почти наверняка будет использовать расширения класса.

extension UIAlertAction { 
    convenience init(title: String) { 
     self.init(title: title, style: .Default, handler: nil) 
    } 
} 

Использование:

let okayAction = UIAlertAction(title: "Okay") 

Вы можете все еще подкласс UIAlertAction добавить свойства к нему. Подкласс все еще может использовать этот инициализатор последовательности, который вы расширили с UIAlertAction.


Наконец, для чего это стоит, someone has already created a Reactive Cocoa UIAlertAction subclass. Они просто сделали это в Objective-C. Увидев, что нет никакого вреда при добавлении Objective-C в ваш проект, вы можете просто воспользоваться этим подходом ... или просто установить этот подкаст ...

+0

Причина, по которой я хочу создать подкласс вместо расширения, заключается в том, что я собираюсь использовать некоторые сохраненные свойства. В любом случае это может быть допустимым решением, если нет сохраненных свойств.Благодарю. –

+1

@bagusflyer Свойства хранилища можно хранить в режиме выполнения Objective-C. Или вы можете подклассы, но просто добавьте свои инициализаторы в расширение (в 'UIAlertAction'). – nhgrif

+0

Это умное предложение. Я это сделаю. Использование расширения для init и подкласса без init. Благодарю. +1 –

0

Как @nhgrif said, используя способ extension. Это дополнительный способ написать код выразительности.

Пример:

/// App alert actions 
extension UIAlertAction { 
    static var cancel: UIAlertAction { 
     return UIAlertAction(title: "Cancel", style: .Cancel, handler: nil) 
    } 
    class func sharePhoto(handler: ((UIAlertAction) -> Void)?) -> UIAlertAction { 
     return UIAlertAction(title: "Share", style: .Default, handler: handler) 
    } 
} 

Используйте его как

alertController.addAction(.cancel) 

alertController.addAction(.sharePhoto({ action in 
    print(action) 
}))