SwiftUI:根据ICAO从结构化数组查询机场纬度并返回的问题
问题:根据ICAO代码查询机场纬度并转为Double类型
用户定义的结构体与数组声明:
struct Airports2: Identifiable, Codable, Hashable{ var AirportID: String = "" var Icao: String = "" var ApType: String = "" var Name: String = "" var Latitude: String = "" var Longitude: String = "" var Altitude: String = "" var Continent: String = "" var Country: String = "" var Region: String = "" var Municipality: String = "" var Service: String = "" var GpsCode: String = "" var Iata: String = "" var LocalCode: String = "" var Link: String = "" var wikiLink: String = "" var Keyword: String = "" let id = UUID() } var FR_airportsDB = [Airports2]()
原函数存在的问题:
contains方法仅返回布尔值,只能判断元素是否存在,无法获取具体的纬度数据,直接强制转换会导致逻辑错误- 通过
Airports2.init(Icao: ApName)创建新实例做匹配,由于结构体中id是唯一UUID,即使ICAO相同,新实例和数组内的实例也会被判定为不相等,导致contains永远返回false
正确实现方案
使用first(where:)方法直接定位匹配ICAO的机场实例,再提取纬度字符串转换为Double。以下是两种安全的实现方式:
方案1:返回可选Double(推荐,避免崩溃)
func getApLat(icaoCode: String) -> Double? { // 查找匹配ICAO的机场 guard let targetAirport = FR_airportsDB.first(where: { $0.Icao == icaoCode }) else { return nil // 无匹配机场时返回nil } // 将纬度字符串转为Double,转换失败也会返回nil return Double(targetAirport.Latitude) }
方案2:返回非可选Double(带默认值)
如果业务要求必须返回非可选类型,可以设置默认值处理异常情况:
func getApLat(icaoCode: String) -> Double { guard let targetAirport = FR_airportsDB.first(where: { $0.Icao == icaoCode }), let latitude = Double(targetAirport.Latitude) else { return 0.0 // 无匹配或转换失败时返回默认值 } return latitude }
高频查询优化建议
如果需要频繁根据ICAO查询机场,可以提前将数组转为字典,大幅提升查询效率:
// 预构建ICAO到机场的映射字典 let airportICAODict = Dictionary(uniqueKeysWithValues: FR_airportsDB.map { ($0.Icao, $0) }) // 优化后的查询函数 func getApLat(icaoCode: String) -> Double? { guard let targetAirport = airportICAODict[icaoCode] else { return nil } return Double(targetAirport.Latitude) }
内容的提问来源于stack exchange,提问作者flyer74
相关产品推荐
相关产品推荐

