草庐IT

ios - 错误 : 'Cannot call value of non-function type' on Swift 3

coder 2023-09-14 原文

以下代码的第二行和第三行适用于 swift 2.3,自从我更新到 swift 3 后,我一直收到错误消息无法调用非函数类型的值 'Any?!' 对于他们两个:

let dic = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableLeaves) as! NSDictionary                    

let lat = ((((dic["results"] as AnyObject).value(forKey: "geometry") as AnyObject).value(forKey: "location") as AnyObject).value(forKey: "lat") as AnyObject).object(0) as! Double
let lon = ((((dic["results"] as AnyObject).value(forKey: "geometry") as AnyObject).value(forKey: "location") as AnyObject).value(forKey: "lng") as AnyObject).object(0) as! Double

self.delegate.locateWithLongitude(lon, andLatitude: lat, andTitle: self.searchResults[(indexPath as NSIndexPath).row])

这是谷歌地图搜索的回调。

该方法正在读取的 JSON 是这样的:

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "São Paulo",
               "short_name" : "São Paulo",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "São Paulo",
               "short_name" : "São Paulo",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "State of São Paulo",
               "short_name" : "SP",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Brazil",
               "short_name" : "BR",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "São Paulo, State of São Paulo, Brazil",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : -23.3566039,
                  "lng" : -46.36508449999999
               },
               "southwest" : {
                  "lat" : -24.0082209,
                  "lng" : -46.825514
               }
            },
            "location" : {
               "lat" : -23.5505199,
               "lng" : -46.63330939999999
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : -23.3566039,
                  "lng" : -46.36508449999999
               },
               "southwest" : {
                  "lat" : -24.0082209,
                  "lng" : -46.825514
               }
            }
         },
         "partial_match" : true,
         "place_id" : "ChIJ0WGkg4FEzpQRrlsz_whLqZs",
         "types" : [ "locality", "political" ]
      }
   ],
   "status" : "OK"
}

有谁知道我做了什么改变才能让它发挥作用?

最佳答案

在解析 JSON 时,Swift 中有一些非常糟糕的事情:

  • 转换为没有类型信息的 NSDictionaryNSArray
  • 转换为非常不确定的 AnyObject
  • valueForKey,这是一种键值编码方法,在这种情况下不是必需的。
  • mutableleaves 选项在使用 Swift 类型时毫无意义,在只读取对象时从不需要。

起诉所有暗示不良编程习惯的教程。 ;-)

请考虑 AnyObject 在 Swift 3 中已被替换为 Any

JSON 仅支持两种集合类型,array – 由 [] 表示 – 和 dictionary – 由 {} 表示.

要可靠地解析 JSON,您必须仔细阅读 JSON 以识别结构并告诉编译器节点的类型。

您的主要错误是关键 results 的值类型错误,它是一个数组

此代码检查是否存在具有可选绑定(bind)的所有键,以及数组是否不为空以及 location 的字典是否包含 2 个项目:

if let jsonObject = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:Any],
  let results = jsonObject["results"] as? [[String:Any]], !results.isEmpty,
  let geometry = results[0]["geometry"] as? [String:Any],
  let location = geometry["location"] as? [String:Double],
  let lat = location["lat"], let lng = location["lng"] {

  print("lat: \(lat) - lng: \(lng)")
} 

苹果发表综合文章Working with JSON in Swift

关于ios - 错误 : 'Cannot call value of non-function type' on Swift 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39550568/

有关ios - 错误 : 'Cannot call value of non-function type' on Swift 3的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  3. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  4. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  5. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  6. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  7. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  8. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  9. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  10. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

随机推荐