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
相关产品推荐
相关产品推荐

