' PFObject'没有名为'下标'的成员

时间:2015-03-09 22:59:59

标签: ios xcode parse-platform swift

据我所知,这个特殊错误已经在这里和那里发布了,而且代码有些基本,但我自己还是无法想出这一个&我需要建议。

当我添加code provided on parse.com for saving objects

的前两行时
var gameScore = PFObject(className:"GameScore")
gameScore["score"] = 1337

第二行出现以下错误:

  

' PFObject'没有名为'下标'

的成员

我在Xcode 6.3 beta 2上。 所有必需的库都与二进制文件链接,<Parse/Parse.h>通过BridgeHeader导入。

我应该使用什么语法?

5 个答案:

答案 0 :(得分:10)

这是因为解析sdk的1.6.4版本在框架中添加了Objective-C Nullability Annotations。特别是文件Parse/PFObject.h定义:

- (PF_NULLABLE_S id)objectForKeyedSubscript:(NSString *)key;

导致Swift编译错误。删除PF_NULLABLE_S可解决问题。

另一方面,键控下标的对象可能是nil似乎是正确的,所以我怀疑这是一个Swift错误......

答案 1 :(得分:6)

问题似乎是改变的方法签名,正如kashif建议的那样。 Swift似乎无法桥接到Objective-C方法,因为签名不再匹配下标方法名称。

解决方法1

您可以通过直接调用下标方法而不是使用[]运算符来修改框架来解决此问题:

而不是使用下面的说明来获取特定键的值:

let str = user["key-name"] as? Bool

请使用以下说明:

let str = user.objectForKey("key-name") as? Bool

而不是使用以下说明来设置特定键的值:

user["key-name"] = "Bla bla"

请使用以下说明:

user.setObject("Bla bla", forKey: "key-name")

解决方法2

另一种解决方案是在实现subscript成员的PFObject上添加扩展并调用setValue:forKey:

extension PFObject {
  subscript(index: String) -> AnyObject? {
    get {
      return self.valueForKey(index)
    }
    set(newValue) {
      if let newValue: AnyObject = newValue {
        self.setValue(newValue, forKey: index)
      }
    }
  }
}

请注意,第二种解决方法并非完全安全,因为我不确定Parse实际上如何实现下标方法(可能他们不只是调用setValue:forKey - 它在我的工作中有效简单的测试用例,所以它似乎是一个有效的解决方法,直到在Parse / Swift中修复它。

答案 2 :(得分:1)

我已成功运行您的确切代码。

首先,确保在设置新值后确实将对象保存在后台:

gameScore.save()

我会仔细检查类名和子类中的拼写错误;如果它们不正确,它将无法正常工作。

如果这不是问题,请在Parse中验证“score”子类是否设置为数字。如果您不小心将其设置为字符串,则将其设置为整数将无效。

如果这些建议没有达成解决方案,那么我不确定问题是什么。希望我帮忙。

答案 3 :(得分:0)

我在带有方法参数的PFConstants.h头文件中遇到了与Parse 1.6.4和1.6.5类似的错误。

Xcode 6.3 beta 4在&#34;新内容中有一个注释...&#34;关于可空性运算符的部分。

在指针运算符和变量名之间移动nullability运算符似乎符合/编译。

更改:

PF_NULLABLE_S NSError *error

为:

NSError * PF_NULLABLE_S error 

  (i.e., NSError* __nullable error)

...解决了编译错误。

这也适用于使用id定义的块参数。所以......

PF_NULLABLE_S id object

变为:

id PF_NULLABLE_S object

在上述情况下,或许:

- (id PF_NULLABLE_S)objectForKeyedSubscript:(NSString *)key;

即,nullability运算符在指针类型之后。

答案 4 :(得分:0)

我知道它已经有一段时间但是当我使用SDK版本1.9.1开始我的第一个Parse应用程序时遇到了类似的问题。

快速入门指南将以下代码作为如何保存值的示例:

    let testObject = PFObject(className: "TestObject")
testObject["foo"] = "bar"
testObject.saveInBackgroundWithBlock { (success: Bool, error: NSError?) -> Void in
  println("Object has been saved.")
}

但是,行testObject["foo"] = "bar"返回了错误'PFObject' does not have a member named 'subscript'。通过将行更改为testObject.setValue("bar", forKey: "foo"),我能够解决问题。 (正如YouTube上的教程视频所示:https://www.youtube.com/watch?v=Q6kTw_cK3zY