类型没有下标成员?

10
我尝试执行以下操作时,出现错误:“Type 'Ship'没有下标成员。”
var coor = ship[index]

我试图去做

var coor = ship?[index] as? Coordinate

但我收到了这个错误提示:"Cannot use optional chaining on non-optional value of type 'Ship'"

以下是我的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
你的 count 属性 getter 可以简写为 return shipCoors?.count ?? 0。顺便说一下。 - dan
4个回答

11
将下标添加到您的 Ship 对象中,以返回一个可选的 Coordinate:
subscript(index: Int) -> Coordinate? {
    guard let coordinate = shipCoors?[index] else {
        return nil
    }
    return coordinate
}

shipCoors 被声明为 [Coordinate]?(一个可选数组),所以有风险 Ship 没有在 shipCoors 中有一个数组。在这种情况下,我返回 nil,但你可以返回任何你想要的东西。


9

在Swift 3中也遇到了类似的问题。

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

在我的情况下,问题很简单,就是没有在函数调用“()”中添加括号。这是初学者常犯的错误。
也就是说,以下代码是罪魁祸首。
dataModel.myFunction

解决方法是通过 dataModel.myFunction() 实现的。

感谢您发布这个答案。即使一个人已经离开学校很长时间,仍然可能犯这个错误(看起来是这样的)。 - Tony Adams
很高兴能帮忙,我每天都会遇到这样的问题 :-) - Naishta

2

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]

to:

intArray.append(n)

这将解决整个问题!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接