ios - 无法将类型“[String]”的值转换为预期的参数类型“([AnyObject]) -> Void”
问题描述
我有一个项目代码如下,我希望它可以从 func getUrls() 中获取 url,但是 Xcode 返回错误消息,如标题所说。
我已经搜索并尝试了一些解决方案来修复它,但都不起作用。我应该用另一种方式写它,还是只修复这个错误?arrUrls 的声明是错误的,还是需要更正?
ps 如果您通过评论回答我,请记得教我如何为您的回答制作“已回答标记”。:) 谢谢。
var arrUrls = [String]()
@IBOutlet weak var webView: UIWebView!
override func viewDidLoad() {
super.viewDidLoad()
getUrls(url: url, completion: arrUrls) // Error Message: Cannot convert value of type '[String]' to expected argument type '([AnyObject]) -> Void'
...do something with array 'arrUrl'....but can't, because of the bug!
}
func getUrls(url : URL ,completion: @escaping (([AnyObject]) -> Void)) {
let task = URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) -> Void in
do {
if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments) as? [String : AnyObject] {
if let subjects = jsonResult["subjects"] as? [AnyObject]? {
for subject in subjects! {
if let content = subject["content"] as? [String : AnyObject] {
let s = String(describing: content["url"]!)
arrUrls.append(s)
}
}
}
}
completion(arrUrls as [AnyObject])
}catch {
print("json error: \(error)")
}
})
task.resume()
}
解决方案
你需要这样打电话
getUrls(url: url) { (arr) in
}
如果您在函数内编辑数组,则无需返回完成值
func getUrls(url : URL ,completion: @escaping (() -> Void))
和
getUrls(url: url) {
// refresh ui here
DispatchQueue.main.async {
if firstItem = self.arrUrls.first , let url = URL(string:firstItem) {
webView.load(URLRequest(url: url))
}
}
将代码更改为此
func getUrls(url : URL ,completion: @escaping (() -> Void)) {
let task = URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) -> Void in
guard let data = data else { return }
do {
if let jsonResult = try JSONSerialization.jsonObject(with: data) as? [String : Any] {
if let subjects = jsonResult["subjects"] as? [[String:Any]] {
for subject in subjects {
if let content = subject["content"] as? [String : Any] {
if let s = content["url"] as? String
{
self.arrUrls.append(s)
}
}
}
completion()
}
}
}catch {
completion()
}
})
task.resume()
}
推荐阅读
- php - 无法将 $_SESSION['user'] 值(保存在 page1 中)放在第 2 页内的输入字段中
- swift - 重新加载 ViewController 中的 tableview 让我在索引路径的 cellforRow 中出现“致命错误:索引超出范围”
- html - 背景:线性渐变()不适用于移动设备
- qt - Excel中如何修改单元格中的数据
- java - 如何将 IntelliJ/Eclipse 的 Azure 工具包连接到 Mooncake 等国家云?
- php - 如果使用特定优惠券,则在 WooCommerce 收到的订单页面上显示自定义文本
- python - Pandas groupby 重叠列表
- arrays - 无法在 Swift 中将对象添加到对象数组
- sockets - 为什么 UdpClient 甚至还有 SendAsync?
- typescript - 从 API 响应中获取嵌套对象的值