W Swift 4 chcę użyć rozbudowa z UIBarButtonItem
tworzy instancję specjalną UIBarButtonItem
obiekt.
Oto mój kod (tylko podstawowe stwierdzenia):
import Foundation
extension UIBarButtonItem {
convenience init(staticImageName: String) {
let staticView = UIImageView.init(image: UIImage(named: staticImageName))
self.init(customView: staticView)
// further code…
}
override open var isEnabled: Bool {
didSet {
print("didSet called") // Should be replaced by other code…
}
}
} // extension UIBarButtonItem
To rozszerzenie buduje się bez problemów.
Jednak po uruchomieniu aplikacji pojawia się błąd wykonania w instrukcji
self.init(customView: staticView)
.
Dziennik mówi:
-[UIBarButtonItem isEnabled]: unrecognized selector sent to instance 0x7fe20c505180
Co jest nie tak z moim kodem?
Odpowiedzi:
0 dla odpowiedzi № 1Rozszerzenia nie powinny być używane do nadpisywania istniejących funkcji. Rozszerzenia mają być używane tylko do dodawania nowych funkcji.
W rozdziale Rozszerzenia w książce Swift:
„Rozszerzenia mogą dodawać nowe funkcje do typu, ale nie mogą zastępować istniejących funkcji”.
Więc właściwym rozwiązaniem jest podklasa UIBarButtonItem
jeśli chcesz zastąpić istniejącą funkcjonalność. Następnie użyj podklasy, gdziekolwiek jej potrzebujesz.