2016-09-28 14 views
7

Niedawno zostałem zmuszony do aktualizacji do Swift 3.0 i wygląda na to, że konwersja Xcode nie wykonała świetnej roboty. Na szczęście jestem w stanie rozwiązać większość problemów ręcznie, jednak mam trochę zamieszania.Czy to jest przesłonięcie metody, czy nie?

Linia ta, że ​​overrode metoda w uiController canBecomeFirstResponder pracował przed uaktualnieniem do Swift 3.0:

override func canBecomeFirstResponder() -> Bool { 
    return true 
} 

Jednakże teraz zwraca błąd:

Method does not override any method from its superclass.

jednak, usuwając override nieco nie robi wydaje się, że to naprawia, ponieważ wywołuje inny błąd, który wydaje się być sprzeczny z poprzednim:

Method 'canBecomeFirstResponder()' with Objective-C selector 'canBecomeFirstResponder' conflicts with getter for 'canBecomeFirstResponder' from superclass 'UIResponder' with the same Objective-C selector

Czy w rzeczywistości występuje nadpisanie? Dlaczego Xcode daje mi tutaj mieszane wiadomości?

Dla porównania przyjrzałem się this question i chociaż jest bardzo podobny, dotyczy klasy, a dotyczy metody. Aby być bezpiecznym, spróbowałem użyć rozwiązania tego pytania, a następnie je zepsułem i podniosłem te same błędy.

Odpowiedz

22

canBecomeFirstResponder została zmieniona z metody w Swift 2.2 na właściwość w Swift 3.0. Oznacza to, że należy zmienić kod, aby zastąpić go jako właściwość zamiast metody.

override var canBecomeFirstResponder: Bool { return true } 
2

Krótki poradnik, aby dowiedzieć się:

  • Mark/select/Highlight canBecomeFirstResponder
  • Prasa ⌘C
  • Prasa ⇧⌘0 (zero nie O), aby dostać się przez okno dokumentacji .
  • Prasa ⌘V
  • Prasa (powrót)

Teraz widać deklarację

var canBecomeFirstResponder: Bool { get } 

widzisz różnicę?

+1

Przepraszam za pytanie głupie, ale co masz na myśli mówiąc "zaznacz"? – Vemonus

+0

Mam na myśli wybrać/podświetlić to. – vadian

+0

Szybki samouczek: po wybraniu należy nacisnąć ⌘C lub wybrać Edycja> Kopiuj, aby skopiować go do schowka, jeśli chcesz go później wkleić. –