2016-03-21 12 views
6

Ich erhalte die Fehlermeldung „Typ‚Schiff‘keinen Index Mitglieder hat, wenn ich versuche zu tun:Typ Hat keine tiefgestellten Mitglieder?

var coor = ship[index] 

Ich versuchte

var coor = ship?[index] as? Coordinate 

Aber ich diesen Fehler zu tun:“ Kann nicht optional Verkettungs verwenden auf nicht-optionalen Wert des Typs 'Schiff'“

Hier ist meine Ship Klasse:

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

Die Coordinate Klasse ist auch vom Typ NSObject, NSCoding, etc ... Die Objekte scheinen im Array zu sein, wenn ich sie (von NSUserDefaults) laden? Wie bekomme ich sie raus ?!

+1

Sie wollen 'ship.shipCoors?[index] ' – dan

+0

Danke euch allen, war in der Lage, das Problem zu lösen! –

+0

Ihr "count" -Eigenschaft-Getter kann einfach 'return shipCoors? .count ?? 0' zw. – dan

Antwort

8

einen Index zu Ihrem Ship Objekt hinzufügen einen optionalen Coordinate zurückzukehren:

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

shipCoors Wird als (ein optionales Array) deklariert, so besteht ein Risiko, dass Ship kein Array in shipCoors hat. In diesem Fall gebe ich nil zurück, aber Sie können stattdessen zurückgeben, was Sie wollen.

5

Hatte ähnliches Problem in Swift 3

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

In meinem Fall war es ein einfacher Fall von nicht die Klammern an die Funktion Abruf „()“ hinzugefügt wird. Schuljungsfehler.

das heißt der folgende Code, um den Täter

dataModel.myFunction 

mit dataModel.myFunction()

0

Für meinen Code gelöst war:

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

    } 
    return intArray 
} 

Ich war immer folgende Fehlermeldung:

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

Es bedeutet, dass die append-Funktion keine Indizes oder [] verwendet!

Änderung der Leitung von

intArray.append[n] 

zu:

intArray.append(n) 

würde das gesamte Problem beheben!

Verwandte Themen