2014-09-25 3 views
0

У меня есть следующий протокол, с 1 варом и 2 индексами:Ошибка при реализации подстрочного, определенных в Протоколе в Swift

protocol Universe{ 

    var count: Int{get} 

    subscript(heroAtIndex index: Int)->SuperPowered {get} 
    subscript(villainAtIndex index: Int)->SuperPowered {get} 

} 

При попытке реализовать этот протокол в этом классе:

class Marvel: Universe{ 

    var _heroes = [ 
    SuperPowered.heroWithFirstName("Peter", lastName: "Parker", alias: "Spiderman"), 
    SuperPowered.heroWithFirstName("Scott", lastName: "Summers", alias: "Cyclops"), 
    SuperPowered.heroWithFirstName("Ororo", lastName: "Monroe", alias: "Storm")] 

    var _villains = [ 
    SuperPowered.villainWithFirstName("Victor", lastName: "Von Doom", alias: "Dr Doom"), 
    SuperPowered.villainWithFirstName("Erik", lastName: "Lehnsher", alias: "Magneto"), 
    SuperPowered.villainWithFirstName("Cain", lastName: "Marko", alias: "Juggernaut")] 

    // UNiverse protocol 

    var count : Int{ 
     get{ 
      return _heroes.count + _villains.count 
     } 
    } 

    subscript(heroAtIndex index: Int)->SuperPowered{ 
     return _heroes[index] 
    } 
} 

Я получаю сообщение об ошибке в строке las (индекс). Он жалуется, что

method 'subscript(heroAtIndex:)' has different argument names from those required by protocol 'Universe' ('subscript(villainAtIndex:)') 
     subscript(heroAtIndex index: Int)->SuperPowered{ 
     ^

Я понятия не имею, что компилятор говорит о: имена одни и те же, и я даже скопировать и вставить.

Что происходит?

+0

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

ответ

3

Аргументы могут быть названы или позиционными. Поместив heroAtIndex index, вы делаете его именованным аргументом; то есть вы должны позвонить subscript(heroAtIndex:x)

У вас возникла проблема в том, что эти два метода имеют точно такие же имена и типы аргументов. Это запутывается и потому, что вы только реализуете один из них, он жалуется, что при попытке найти реализацию другой, у которой вы получили неправильные имена аргументов.

Когда вы реализуете оба из них (как говорит ваш протокол), ошибка времени компиляции больше не возникает, поэтому проблема исчезает, как и сообщение об ошибке.

+0

Я столкнулся с одной и той же проблемой и потратил полчаса, пытаясь понять, что случилось. Поскольку реализация первого из моих двух методов нарушила завершение кода для второго, я никогда не добавлял второй, и, таким образом, осознавая, что ничего не случилось. О Xcode! – josephap

Смежные вопросы