首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >混淆Swift错误:没有更多上下文的表达式类型是不明确的

混淆Swift错误:没有更多上下文的表达式类型是不明确的
EN

Stack Overflow用户
提问于 2021-04-09 14:55:25
回答 1查看 364关注 0票数 0

我在下面的函数中得到了一个令人困惑的错误:Type of expression is ambiguous without more context,我不知道是什么导致了它。我认为这与我的三个let常量有关,因为当我在那里做一些更改时,出现了错误。

代码语言:javascript
运行
复制
private func FetchOriginCoordinates(completion: @escaping ([NominationStructure]) -> ()) {
        let locationUrl = "https://nominatim.openstreetmap.org/search?country=Sweden&city=Stockholm&street=\(self.origin.input)&format=json"
        
        let encodedLink = locationUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
        let encodedURL = URL(string: encodedLink!)
        
        URLSession.shared.dataTask(with: locationUrl!) {data, response, error in
            if let data = data {
                do {
                    if let decodedJson = try? JSONDecoder().decode([NominationStructure].self, from: data) {
                        
                        DispatchQueue.main.async {
                            completion (decodedJson)
                        }
                    }
                } catch {
                    print(error)
                }
            }
        }.resume() // This is where the error appears 
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-09 16:55:19

大多数情况下,Swift中的错误并没有真正的帮助。您的问题是,您试图向数据任务方法传递字符串而不是URL。此外,您应该始终处理错误,而不是忽略它。我还将更改方法声明,以将错误包含在完成处理程序中:

注意:使用小写字母命名方法是一种快速命名约定。

代码语言:javascript
运行
复制
private func fetchOriginCoordinates(completion: @escaping ([Place]?, Error?) -> ()) {
    let url = URL(string:  "your APY string")!
    URLSession.shared.dataTask(with: url) { data, response, error in
        guard let data = data else {
            completion(nil, error)
            return
        }
        do {
            let decodedJson = try JSONDecoder().decode([Place].self, from: data)
            DispatchQueue.main.async {
                completion(decodedJson, nil)
            }
        } catch {
            completion(nil, error)
        }
    }.resume()
}

编辑/更新:

要正确编码URL,您应该使用URLComponents并将地址组件添加到其查询项中:

代码语言:javascript
运行
复制
private func fetchOriginCoordinates(for street: String,
                                country: String = "Sweden",
                                city: String = "Stockholm",
                                format: String = "json",
                                completion: @escaping ([Place]?, Error?) -> ()) {
    var urlComp = URLComponents()
    urlComp.scheme = "https"
    urlComp.host = "nominatim.openstreetmap.org"
    urlComp.path = "/search"
    urlComp.queryItems = [
        .init(name: "country", value: country),
        .init(name: "city", value: city),
        .init(name: "street", value: street),
        .init(name: "format", value: format)
    ]
    guard let url = urlComp.url else {
        completion(nil, URL.Error.invalidCharacterFound(street))
        return
    }
    URLSession.shared.dataTask(with: url) { data, response, error in
        guard let data = data else {
            completion(nil, error)
            return
        }
        do {
            let decodedJson = try
                JSONDecoder().decode([Place].self, from: data)
            DispatchQueue.main.async {
                completion(decodedJson, nil)
            }
        } catch {
            completion(nil, error)
        }
    }.resume()
}

用法:

代码语言:javascript
运行
复制
struct Place: Codable {
    let placeID: Int
    let licence: String
    let osmType: OsmType
    let osmID: Int
    let boundingbox: [String]
    let lat, lon, displayName: String
    let rootClass: Class
    let type: TypeEnum
    let importance: Double

    enum CodingKeys: String, CodingKey {
        case placeID = "place_id", licence, osmType = "osm_type", osmID = "osm_id", boundingbox, lat, lon, displayName = "display_name", rootClass = "class", type, importance
    }
}

代码语言:javascript
运行
复制
enum OsmType: String, Codable {
    case way
}

代码语言:javascript
运行
复制
enum Class: String, Codable {
    case highway
}

代码语言:javascript
运行
复制
enum TypeEnum: String, Codable {
    case residential, secondary, unclassified
}

代码语言:javascript
运行
复制
extension URL {
    enum Error: Swift.Error {
        case invalidCharacterFound(String)
    }
}

代码语言:javascript
运行
复制
fetchOriginCoordinates(for: "Valhallavägen") { results, error in
    guard let results = results else {
        print("error:", error ?? "nil")
        return
    }
    for result in results {
        print(result)
    }
}

这将打印:

Place(placeID: 100830896,许可证:“ODbL 1.0. https://osm.org/copyright"、osmType: OsmType.way、osmID: 41510350”、"59.3431062“、"59.3438379”、"18.0792506“、"18.0821732”、lat:"59.3434756“、lon:"18.0807072”、displayName:“Valhallav gen、Ladug rdsg rdet、stermalms stadsdelsomr de、斯德哥尔摩、Stockholms kommun、斯德哥尔摩县、114 36、瑞典、rootClass: Class.highway,类型: TypeEnum.secondary、重要性: 0.6138276880810758)

地点(placeID: 110921085,许可证:“OpenStreetMap贡献者数据”,ODbL 1.0. https://osm.org/copyright",osmType: OsmType.way,osmID: 95305155,分界线:"59.3473458","59.3475855","18.0653022","18.0654864",lat:"59.3475219",lon:"18.0653483",displayName:“Valhallav gen,Ruddammen,Norra rden,stermalms stadsdelsomr de,斯德哥尔摩,Stockholms kommun,斯德哥尔摩县,114 24,瑞典,rootClass: Class.highway,type: TypeEnum.secondary,重要性: 0.6138276880810758)

地点(placeID: 98613676,许可证:“OpenStreetMap贡献者”,ODbL 1.0. https://osm.org/copyright",osmType: OsmType.way,osmID: 33057170,分界线:"59.3458032","59.3459006","18.0692504","18.0695413",lat:"59.3459006",lon:"18.0692504",displayName:“Valhallav gen,L rkstaden,osmID,stermalm,stermalms stadsdelsomr de,斯德哥尔摩,Stockholms kommun,斯德哥尔摩县,100 41,瑞典,rootClass: Class.highway,type: TypeEnum.secondary,重要性: 0.6138276880810758)

地点(placeID: 97771827,许可:“数据( OpenStreetMap )贡献者,ODbL 1.0。https://osm.org/copyright",osmType: OsmType.way,osmID: 32125128,分界线:"59.3435989","59.3440214","18.0767179","18.0788456",lat:"59.3437642",lon:"18.0781052",displayName:“Valhallav gen,Villastaden,stermalm,stermalms stadsdelsomr de,斯德哥尔摩,Stockholms kommun,斯德哥尔摩,斯德哥尔摩,Stockholms kommun,斯德哥尔摩县,114 36,瑞典,rootClass: Class.highway,类型: TypeEnum.secondary,重要程度: 0.6138276880810758) Place(placeID: 217216781,许可证:"Data OpenStreetMap贡献者,ODbL 1.0。https://osm.org/copyright",osmType: OsmType.way,osmID: 621715886,分界线:"59.3400363","59.3400593","18.0943109","18.0944135",lat:"59.3400593",lon:"18.0943109",displayName:“Valhallav gen,Ladug rdsg rdet,stermalms stadsdelsomr de,斯德哥尔摩,Stockholms kommun,斯德哥尔摩县,115 24,瑞典,rootClass: Class.highway,类型: TypeEnum.secondary,重要程度: 0.6138276880810758) Place(placeID: 91379768,牌照:"Data OpenStreetMap贡献者,ODbL 1.0。https://osm.org/copyright",osmType: OsmType.way,osmID: 16620413,分界线:"59.3500575","59.3502804","18.0588563","18.0593429",lat:"59.3500575",lon:"18.0593429",displayName:“Valhallav gen,Ruddammen,Norra Djurg rden,stermalms stadsdelsomr de,斯德哥尔摩,Stockholms kommun,斯德哥尔摩,1154,瑞典,rootClass: Class.highway,类型: TypeEnum.secondary,重要程度: 0.6138276880810758)

地点(placeID: 122081536,许可:“数据( OpenStreetMap )贡献者,ODbL 1.0。https://osm.org/copyright",osmType: OsmType.way,osmID: 137883176,分界框:"59.3467668","59.3469813","18.0671955","18.0678302",lat:"59.3468409",lon:"18.0676219",displayName:“Valhallav gen,Ruddammen,Norra Djurg rden,stermalms stadsdelsomr de,斯德哥尔摩,Stockholms kommun,斯德哥尔摩县,100 41,瑞典,rootClass: Class.highway,类型: TypeEnum.residential,重要程度: 0.6138276880810758) Place(placeID: 210614450,许可证:"Data OpenStreetMap贡献者,ODbL 1.0。https://osm.org/copyright",osmType: OsmType.way,osmID: 571062827,分界线:"59.3469813","59.3471276","18.067152","18.0671955",lat:"59.3469813",lon:"18.0671955",displayName:“Valhallav gen,Ruddammen,Norra Djurg rden,stermalms stadsdelsomr de,斯德哥尔摩,Stockholms kommun,斯德哥尔摩,114 24,瑞典,rootClass: Class.highway,类型: TypeEnum.residential,重要程度: 0.6138276880810758)

地点(placeID: 100832986,许可证:“OpenStreetMap贡献者数据”,ODbL 1.0. https://osm.org/copyright",osmType: OsmType.way,osmID: 40886504,分界线:"59.3459069","59.3467668","18.0678302","18.0702113",lat:"59.3464817",lon:"18.0686787",displayName:“Valhallav gen,Ruddammen,Norra rden,stermalms stadsdelsomr de,斯德哥尔摩,Stockholms kommun,斯德哥尔摩县,100 41,瑞典,rootClass: Class.highway,type: TypeEnum.unclassified,重要性: 0.6138276880810758)

地点(placeID: 172222242,许可证:“OpenStreetMap贡献者数据”,ODbL 1.0. https://osm.org/copyright",osmType: OsmType.way,osmID: 345280785,分界线:"59.3453872","59.3458192","18.0701008","18.0715971",lat:"59.3457283",lon:"18.0702244",displayName:“Valhallav gen,Ruddammen,Norra rden,stermalms stadsdelsomr de,斯德哥尔摩,Stockholms kommun,斯德哥尔摩县,114 26,瑞典,rootClass: Class.highway,type: TypeEnum.unclassified,重要性:0.6138276880810758)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67023427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档