【问题标题】:Cannot call value of non-function type '((UInt) -> Data?)!'无法调用非函数类型“((UInt)->数据?)!”的值
【发布时间】:2016-09-19 23:08:52
【问题描述】:

当我将 swift 2 转换为 swift 3 时出现以下消息 无法调用非函数类型的值((UInt) -> Data?)!

func parseSJSON(_ data2: AnyObject) {      
    /** INITIALIZE THE SESSION **/
    clearUserInfo()
    if let data = data2.data(using: String.Encoding.utf8) {
        let json = JSON(data: data)
        let userID = json["userID"].stringValue
        prefs.setValue(userID, forKey: "userID")
    }
}

【问题讨论】:

  • data2 是一个AnyObject,所以它不知道你打电话给.data(using:) 是怎么回事。 data2 真的是什么?
  • data2 是一个 json 对象
  • data(using: UInt)NSString 的方法,data(using: String.Encoding)String 的方法。因此,如果 data2 不是字符串,则您的代码没有任何意义。您的意思是 data2 是 JSON 对象的 字符串表示 吗?如果是这样,请将AnyObject 替换为String
  • 当您说“JSON”对象时,您是说它是您在某些网络响应中收到的原始Data/NSData?或者它是JSONSerialization.jsonObject(with:options:) 的输出还是您从Alamofire 的responseJSON 收到的对象?向我们展示您如何创建传递给 parseSJSON 的对象,我们可以告诉您如何将其传递给 SwiftyJSON。
  • 我从 http post 收到的数据/NSData

标签: ios swift3 xcode8


【解决方案1】:

感谢您的帮助,我尝试了不同的方法,但它们都不起作用。 通过尝试和错误,我将代码更改为此并且它可以工作!

func parseSJSON(_data2: AnyObject, 目录:String) //func parseSJSON(_data2:Data,catalog:String)

{

    clearUserInfo()
   // if let data = data2.data(using: String.Encoding.utf8) {

   if let data = data2.data(using: String.Encoding.utf8.rawValue) {
        let json = JSON(data: data)

        let userID = json["userID"].stringValue
        prefs.setValue(userID, forKey: "userID")
  }

}

【讨论】:

    【解决方案2】:

    你说

    data2let object = try JSONSerialization.jsonObject(with: data!, options:.allowFragments)

    在这种情况下,只需将其直接传递给采用NSArray/NSDictionaryJSON init 方法,即没有data: 参数标签的再现:

    let json = JSON(data2)    // note, if parameter is `Any` (the `NSDictionary`/`NSArray` structure of parsed JSON), then do not include `data:`
    

    顺便说一句,如果您要自己解析它,则不需要.allowFragments,例如

    let object = try JSONSerialization.jsonObject(with: data!, options: [])
    

    或者,更简单的是,根本不调用JSONSerialization,直接传递Data

    parse(data: data!)
    

    然后让parse(data:) 调用JSON(data:),它会为你解析:

    func parse(data: Data) {
        clearUserInfo()
        let json = JSON(data: data)     // note, if parameter is `Data`, include `data:`
        let userID = json["userID"].stringValue
        prefs.setValue(userID, forKey: "userID")
    }
    

    之前你说data2是一个

    Data/NSData 我从 http post 收到的

    在这种情况下,只需转换它,不要使用.data(using:),例如

    func parseSJSON(_ data2: AnyObject) {      
        ...
    
        if let data = data2 as? Data {
            // use `data` here
        }
    }
    

    【讨论】:

    • 抱歉 data2 是让 object = try JSONSerialization.jsonObject(with: data!, options:.allowFragments)
    • 查看修改后的答案。底线,要么使用JSONSerialization返回的Any对象调用JSON(object),或者更简单,更改方法以采用Data参数,根本不要调用JSONSerialization,让SwiftyJSON为你。
    猜你喜欢
    • 1970-01-01
    • 2017-08-16
    • 2020-02-01
    • 2021-01-15
    • 2021-03-30
    • 2016-03-10
    • 2016-09-26
    • 2017-06-27
    • 2019-05-05
    相关资源
    最近更新 更多