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