I get the error "Type 'Ship' has no subscript members when I try to do:
var coor = ship[index]
I tried to do
var coor = ship?[index] as? Coordinate
But I get this error: "Cannot use optional chaining on non-optional value of type 'Ship'"
Here's my Ship class:
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")
}
}
The Coordinate class is also of type NSObject, NSCoding, etc...
The objects seem to be in the array when I load them (from NSUserDefaults)? How do I get them out?!
Had similar issue in Swift 3
Type '() -> [myObject]' has no subscript members
In my case, It was a simple case of not adding the brackets to the function-call "()". school boy error.
i.e. the below code was the culprit
dataModel.myFunction
Solved with dataModel.myFunction()
Add a subscript to your Ship object to return an optional Coordinate:
subscript(index: Int) -> Coordinate? {
guard let coordinate = shipCoors?[index] else {
return nil
}
return coordinate
}
shipCoors is declared as [Coordinate]? (an optional array), so there's a risk a Ship won't have an array in shipCoors. In this case I return nil, but you can return whatever you want instead.
You have to explicitly add subscripting support to the class in order to use the subscript syntax, e.g. ship[index].
Here are the docs that cover subscripting and how to add subscripting to your class:
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Subscripts.html
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With