【问题标题】:'PFObject' does not have a member named 'subscript'“PFObject”没有名为“下标”的成员
【发布时间】:2015-03-09 22:59:58
【问题描述】:

我明白,这个特定的错误已经在这里和那里发布并且代码有些基本,但我自己仍然无法解决这个问题并且我需要建议。

问题是当我添加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 导入。

我应该使用什么语法?

【问题讨论】:

    标签: ios xcode parse-platform swift


    【解决方案1】:

    这是由于 parse sdk 的 1.6.4 版本在框架中添加了 Objective-C Nullability Annotations 造成的。特别是文件Parse/PFObject.h 定义:

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

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

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

    【讨论】:

    • 删除PF_NULLABLE_S是什么意思?比如说,我应该评论- (PF_NULLABLE_S id)objectForKeyedSubscript:(NSString *)key; 吗?
    • 我的意思是把PFObject.h改成:-(id) objectForKeyedSubscript:(NSString *)key;
    • 感谢@kashif 解决这个问题!我添加了一个答案,展示了如何在不更改框架的情况下解决此问题。
    • @ben-g 很酷,谢谢,我自己正在使用setObject(...)...但是是的,我也谢谢你!
    【解决方案2】:

    问题似乎是更改的方法签名,正如 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 中修复此问题之前,这似乎是一种有效的解决方法。

    【讨论】:

    • 感谢您的回答。另一个解决方法是只使用稳定版本的 Xcode,直到 6.3 是强制性的。事实上,现在我使用 6.2 作为我的主要 IDE 和 6.3 测试版,以使我的更稳定的项目适应 Swift 1.2。至于.setObject,我在创建此讨论时已经在处理我的代码,但我想确保[ ] 运算符不再适用于 Swift 1.2。
    【解决方案3】:

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

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

    gameScore.save()
    

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

    如果这不是问题,请在 Parse 中验证“score”子类是否设置为数字。如果不小心设置为字符串,设置为整数是行不通的。

    如果这些建议没有解决问题,那么我不确定问题出在哪里。希望我能帮上忙。

    【讨论】:

    • 感谢您的回复。不,事实上,它们是我写的仅有的两行。所以我没有试图保存一些东西,我也没有机会拼错任何东西。我得到与gameScore["playerName"] = "Sean Plott"gameScore["cheatMode"] = false 完全相同的错误。
    【解决方案4】:

    我在带有方法参数的 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 
    
      (i.e., NSError* __nullable error)
    

    ...解决了编译器错误。

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

    PF_NULLABLE_S id object
    

    变成:

    id PF_NULLABLE_S object
    

    在上述情况下,也许:

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

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

    【讨论】:

      【解决方案5】:

      我知道已经有一段时间了,但是当我使用 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-08
        • 2015-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-17
        • 1970-01-01
        • 2015-01-09
        相关资源
        最近更新 更多