Swift报Type of expression is ambiguous without more context错误如何解决
错误原因
- 闭包传参语法错误:调用
getGarbageSchedule方法时,不需要在completion参数位置显式写(GarbageModel?) -> Void类型声明,多余的类型声明导致编译器无法匹配方法签名,触发类型歧义报错。 - 字符串格式化语法错误:
String(format: "%s")是用于C语言字符串的占位符,Swift的String类型需要用%@占位符,同时直接强制解包可选值容易触发运行时崩溃,建议增加可选绑定判断。
修复后调用代码
let garbageService = GarbageService() // 写法1:标准参数传参 garbageService.getGarbageSchedule(street: "HATHAWAY DR", completion: { garbageData in if let street = garbageData?.street { print("STREETS: \(street)") // 若需要使用format写法可替换为下行 // print("STREETS: "+String(format:"%@", street)) } }) // 写法2:Swift 尾随闭包语法(更简洁) garbageService.getGarbageSchedule(street: "HATHAWAY DR") { garbageData in if let street = garbageData?.street { print("STREETS: \(street)") } }
其他潜在问题优化建议
原代码中garbageBaseURL!是隐式强制解包,如果URL初始化失败会直接崩溃,建议增加解包判断:
func getGarbageSchedule(street : String,completion: @escaping (GarbageModel?) -> Void) { guard let baseURL = garbageBaseURL, let garbageURL = URL(string:"\(street)",relativeTo: baseURL) else { completion(nil) return } let clientApi = networkManager(url : garbageURL) clientApi.DownloadJSONFromURL{ (jsonDictionary) in print(jsonDictionary as? [String : Any]) if let garbageDataDictionary = jsonDictionary?["STREETS"] as? [String:Any]{ let garbageData = GarbageModel(garbageDictionary: garbageDataDictionary) completion(garbageData) } else{ completion(nil) } } }
内容的提问来源于stack exchange,提问作者Advitiya Jadhav
相关产品推荐
相关产品推荐

