You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中Switch内定义query报错Cannot find 'query' in scope求助

解决Swift中switch语句内定义变量无法在外部访问的问题

错误原因

你在switch的每个case块内用let query定义了局部变量,这些变量的作用域仅限于当前case内部,switch外部的代码无法访问到它们,因此编译器抛出「Cannot find 'query' in scope」错误。

修复方案

在switch语句之前声明query变量,然后在每个case内直接给这个变量赋值(去掉let关键字),让变量的作用域覆盖到后续执行查询的代码块。

另外注意你的代码里存在一个逻辑错误:IATA分支的where条件误写为匹配codeICAOAirport,应该改为匹配codeIataAirport,否则筛选逻辑不符合预期。

修正后的完整代码

class AirportsDataSource {
    
    var db: Connection?
    var filterOption: String = "IATA"
    
    init() {
        do {
            guard let fileURL = Bundle.main.url(forResource: "airports", withExtension: "sqlite") else 
            {
                print("Could not find the airports.sqlite file in the app bundle.")
                return
            }
            db = try Connection(fileURL.path)
            
        } catch {
            print(error)
        }
    }
    
    func search(_ text: String) -> [Airport] {
        guard let db = db else { return [] }
        
        do {
            let airports = Table("mytable")
            let airportId = Expression<Int?>("airportId")
            let codeIataAirport = Expression<String?>("codeIataAirport")
            let codeICAOAirport = Expression<String?>("codeICAOAirport")
            let name = Expression<String?>("name")
            let nameAirportName = Expression<String?>("nameAirport")
            let latitude = Expression<String?>("latitudeAirport")
            let longitude = Expression<String?>("longitudeAirport")
            
            // 在switch前声明query变量,复用基础查询结构
            var query = airports
                .select(airportId, codeIataAirport, nameAirportName, latitude, longitude)
                .limit(100)
            
            switch filterOption {
                case "IATA":
                    query = query
                       .where(codeIataAirport.like("%\(text)%"))
                       .order(codeIataAirport)
                case "ICAO":
                    query = query
                        .where(name.like("%\(text)%") || nameAirportName.like("%\(text)%"))
                        .order(codeICAOAirport)
                case "Airport Name":
                    query = query
                        .where(name.like("%\(text)%") || nameAirportName.like("%\(text)%"))
                        .order(nameAirportName)
                default:
                    query = query
                        .where(
                            codeIataAirport.like("%\(text)%") ||
                            codeICAOAirport.like("%\(text)%") ||
                            name.like("%\(text)%") ||
                            nameAirportName.like("%\(text)%")
                        )
                        .order(codeIataAirport.asc)
            }
            
            return try db.prepare(query).map
            { .init(
                id: $0[airportId] ?? .random(in: 11000...12000),
                name: $0[nameAirportName] ?? "N/A",
                code: $0[codeIataAirport] ?? "N/A",
                lat: $0[latitude] ?? "0.0",
                long: $0[longitude] ?? "0.0"
            ) }
            
          
        } catch {
            print("error reading table", error)
            return []
        }
    }
}

关键说明

  • 提前声明var query并赋予基础查询结构,避免重复编写相同的select和limit代码,提升代码复用性
  • 每个case仅修改查询的where和order条件,逻辑更清晰
  • 修正了IATA分支的筛选条件,确保逻辑符合选项预期

内容的提问来源于stack exchange,提问作者Andy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 22:30:26