2016-03-21 20 views
6

pojawia się błąd „Type«Statek»nie ma członków indeksy dolne gdy próbuję zrobić:Wpisz Brak członków w indeksie?

var coor = ship[index] 

Próbowałem zrobić

var coor = ship?[index] as? Coordinate 

Ale otrzymuję ten błąd:” Nie można użyć opcjonalnego łańcuchowym na non-opcjonalne wartości typu 'statek'”

Oto mój Ship klasa:

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") 
    } 
} 

Klasa jest również typu NSObject, NSCoding, itp ... Obiekty wydają się być w tablicy, gdy je ładuję (od NSUserDefaults)? Jak je wydostać ?!

+1

Chcesz "ship.shipCoors?[indeks] ' – dan

+0

Dziękuję wszystkim, udało się rozwiązać problem! –

+0

Twoja właściwość getter 'count' może po prostu być' return shipCoors? .count ?? 0' btw. – dan

Odpowiedz

8

Dodaj indeks do obiektu Ship wrócić opcjonalnego Coordinate:

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

shipCoors jest zadeklarowany jako [Coordinate]? (opcjonalna tablica), więc istnieje ryzyko, że Ship nie będzie mieć tablicy w shipCoors. W tym przypadku zwracam nil, ale możesz zamiast tego zwrócić wszystko, co chcesz.

5

Gdyby podobny problem w Swift 3

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

W moim przypadku była to prosta sprawa nie dodając wsporniki do funkcji-call „()”. błąd chłopca szkolnego.

czyli poniżej kod był winowajcę

dataModel.myFunction 

rozwiązany dataModel.myFunction()

0

Dla mojego kodu:

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

    } 
    return intArray 
} 

ja otrzymuję następujący błąd:

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

Oznacza to, że funkcja append nie używa indeksów dolnych ani []!

zmieniając linię

intArray.append[n] 

do:

intArray.append(n) 

rozwiąże cały problem!