2016-10-21 29 views
9

Próbuję przenieść moją bazę kodu do wersji 3.0 przy użyciu xCode. Jest kilka kwestii, których nie jestem w stanie zrozumieć.Błąd migracji Swift 3.0: wpisz "Element" ograniczony do typu bez protokołu "IndexPath"

Problem: Type 'Element' constrained to non-protocol type 'IndexPath'

enter image description here

W lewej części panelu nawigacyjnego błędu to pokazuje tylko poniżej błędów. Nie jestem w stanie zrozumieć, która linia kodu lub gałąź kodu powoduje błąd.

enter image description here

Czy ktoś może mi pomóc rozwiązać to proszę.

UPDATE

Po wielu staraniach utknąłem w tych kwestiach.

enter image description here

UPDATE

Dziękuję wszystkim za pomoc. Teraz miałem do czynienia tylko z następującymi problemami.

enter image description here

Niewielu z was z prośbą, aby opublikować kod źródłowy ale Xcode nie wykazały jakiegokolwiek ostrzeżenia lub błędu na stronach. Istnieje kilka leków generycznych

private extension Array where Element: IndexPath { 

    func indexOf(_ indexPath: IndexPath) -> Int { 
     var counter = 0 
     for object in self { 
      if object.section == indexPath.section && object.row == indexPath.row { 
       return counter 
      } 
      counter += 1 
     } 
     return 0 
    } 
} 


fileprivate func < <T : Comparable>(lhs: T?, rhs: T?) -> Bool { 
    switch (lhs, rhs) { 
    case let (l?, r?): 
    return l < r 
    case (nil, _?): 
    return true 
    default: 
    return false 
    } 
} 
+2

akcji linia kodu, w której stoją ten problem – Wolverine

+0

w pliku nie ma błędu lub ostrzeżenia seans. –

+0

@Wolverine zobacz zaktualizowane pytanie. –

Odpowiedz

40

w Swift 3 można używać tylko protokołów, aby ograniczyć swoje rozszerzenie, ponieważ jest to uniwersalne, a więc extension Array where Element: IndexPath { nie zadziała, ponieważ IndexPath nie jest protokołem.

w Swift 3.1 to się zmienia (patrz here), dzięki czemu będziemy w stanie wykorzystać konkretny typ z nieco innej składni:

extension Array where Element == IndexPath { 

Jeśli nie można przejść do szybkiej 3.1 jeszcze wtedy może przetasować wokół to poprzez stworzenie protokołu, coś jak:

protocol Indexable { 
    var row: Int { get } 
    var section: Int { get } 
} 

extension IndexPath: Indexable {} 

extension Array where Element: Indexable { 
    ... 
+0

Dzięki bro .. uratowałeś mnie ....:) –

+0

Czy jest jeszcze możliwa aktualizacja do wersji Swift 3.1? –

+0

Odpowiadając na moje własne pytanie (tak!): Https://www.hackingwithswift.com/example-code/language/how-to-install-a-beta-version-of-swift –