‘PFObject’没有名为’下标’的成员

我明白,这个特殊的错误已经发布到这里和那里,代码有些基本,但我自己仍然无法弄清楚这一点,我需要建议。

问题是当我添加parse.com上提供的前两行代码来保存对象时

var gameScore = PFObject(className:"GameScore") gameScore["score"] = 1337 

我在第二行收到以下错误:

‘PFObject’没有名为’下标’的成员

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

我应该使用什么语法?

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

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

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

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

问题似乎是改变了方法签名,正如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

另一个解决方案是在PFObject上添加一个扩展,它实现了subscript成员并调用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中修复此问题。

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

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

 gameScore.save() 

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

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

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

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

Xcode 6.3 beta 4在关于可空性运算符的“New in …”部分中有一个注释。

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

更改:

 PF_NULLABLE_S NSError *error 

至:

 NSError * PF_NULLABLE_S error (ie, NSError* __nullable error) 

…解决了编译错误。

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

 PF_NULLABLE_S id object 

变为:

 id PF_NULLABLE_S object 

在上述情况下,也许:

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

即,可空性运算符在指针类型之后。

我知道它已经有一段时间了但是当我用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上的教程video所示: https : //www.youtube.com/watch?v = Q6kTw_cK3zY )