2016-03-21 4 views
6

я получаю ошибку «Тип„Корабль“не имеет членов подстрочных, когда я пытаюсь сделать:У пользователя нет подписчиков?

var coor = ship[index] 

Я пытался сделать

var coor = ship?[index] as? Coordinate 

Но я получаю эту ошибку:» Невозможно использовать дополнительные цепочки на неопциональном значении типа "Судовой»

Вот мой Ship класса:

import Foundation 

class Ship: NSObject, NSCoding { 

    var shipCoors: [Coordinate]? 

    var count: Int { 
     var count = 0 
     for _ in shipCoors! { 
      count++ 
     } 
     return count 
    } 

    init(shipCoors: [Coordinate]) { 
     self.shipCoors = shipCoors 
    } 

    required init(coder decoder: NSCoder) { 
     self.shipCoors = decoder.decodeObjectForKey("shipCoors") as? [Coordinate] 
    } 

    func encodeWithCoder(coder: NSCoder) { 
     coder.encodeObject(shipCoors, forKey: "shipCoors") 
    } 
} 

Класс Coordinate также имеет тип NSObject, NSCoding и т. Д. Объекты, кажется, находятся в массиве при загрузке (от NSUserDefaults)? Как я их вытащить ?!

+1

Вы хотите 'ship.shipCoors?[index] ' – dan

+0

Спасибо всем, удалось решить проблему! –

+0

Ваш счетчик 'count' может быть просто' return shipCoors? .count ?? 0' кстати. – dan

ответ

8

Добавить индекс к вашему Ship объекту вернуть дополнительный Coordinate:

subscript(index: Int) -> Coordinate? { 
    guard let coordinate = shipCoors?[index] else { 
     return nil 
    } 
    return coordinate 
} 

shipCoors объявляется как [Coordinate]? (необязательный массив), поэтому существует риск, что Ship не будет иметь массив в shipCoors. В этом случае я возвращаю nil, но вы можете вернуть то, что хотите.

1

Вы должны явно добавить поддержку подписчика для класса, чтобы использовать синтаксис подстроки, например. ship[index].

Вот документы, которые охватывают индексацию и как добавить индексацию к классу:

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Subscripts.html

5

Если бы подобный вопрос в Swift 3

Type '() -> [myObject]' has no subscript members 

В моем случае, это был простой случай, не добавляя скобки к функции вызова «()». ошибка школьного мальчика.

т.е. ниже код был виновником

dataModel.myFunction 

решаемые с dataModel.myFunction()

0

Для моего кода:

func takeN(_ numbers: Int...) -> [Int]{ 
    var intArray : [Int] = [] 
    for n in numbers{ 
     intArray.append[n] 

    } 
    return intArray 
} 

Я получаю следующее сообщение об ошибке:

error: type '(Int) ->()' has no subscript members intArray.append[n]

Это означает, что функция append не использует индексы или []!

изменяя линию

intArray.append[n] 

к:

intArray.append(n) 

бы решить все проблемы!