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

IT *_*psy 7 xcode ios parse-platform swift

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

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

var gameScore = PFObject(className:"GameScore")
gameScore["score"] = 1337
Run Code Online (Sandbox Code Playgroud)

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

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

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

我应该使用什么语法?

kas*_*hif 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错误......

  • 我的意思是将它在`PFObject.h`中更改为:``` - (id)objectForKeyedSubscript:(NSString*)key;``` (3认同)

Ben*_*n-G 6

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

解决方法1

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

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

let str = user["key-name"] as? Bool
Run Code Online (Sandbox Code Playgroud)

请使用以下说明:

let str = user.objectForKey("key-name") as? Bool
Run Code Online (Sandbox Code Playgroud)

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

user["key-name"] = "Bla bla"
Run Code Online (Sandbox Code Playgroud)

请使用以下说明:

user.setObject("Bla bla", forKey: "key-name")
Run Code Online (Sandbox Code Playgroud)

解决方法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)
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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