2016-02-06 1 views
1

Как решить эту проблему?Подзаголовок a Произвольный тип generics: ошибка: не может индексировать значение типа '[T]'

protocol Mappable { 
    ... 
} 
class Foo { 
    item:AnyObject 
} 
class SomeClass<T:Mappable> { 
    var someObject = Foo() 
    var items:[T] 
    ... 
    func someFunction() { 
     someObject.item = items[index] // error: Cannot subscript a value of type '[T]' 
    } 

Я пытался добавить расширение для индексации [T], но не в состоянии:

extension Array where Element:Mappable { 
    subscript(index: Int) -> Element? { 
     return indices ~= index ? self[index] : nil 
    } 
} 

UPDATE: Это сообщение об ошибке в заблуждение, пожалуйста, см ответы ниже

+0

Сообщение об ошибке вводит в заблуждение. Просто добавьте возвращаемый тип в метод. Расширение не требуется. – vadian

+0

Пожалуйста, не добавляйте ответ на вопрос. Формат SO - это вопрос + ответ (ы). – Cristik

ответ

1

Проблема заключается не столько в подписчиках. Речь идет о преобразовании типов. Swift дал ошибочное сообщение об ошибке. Посмотрите на этой линии:

someObject.item = items[index] 
    AnyObject^^Mappable 

Swift не неявно преобразовать Mappable в AnyObject. Вместо этого вы должны использовать силовое приведение:

func someFunction() { 
    // Assuming `index` is an Int 
    someObject.item = items[index] as! AnyObject 
} 
+0

да, вы правы! – Alston

0

Вот только небольшое изменение в вашем классе. Просто посмотри на это!

class SomeClass<T: Mappable>{ 
    var items:[T] = [] 
    func getSomeItem(index:Int) -> T{ 
     return self.items[index] as T // no error 
    } 
} 

Надеюсь, что это поможет!

+0

Сторона примечания: 'as T' является избыточным, компилятор знает тип – vadian

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