SQLite.swift 和 Swift 3 "Ambiguous reference to member ==" 加入
SQLite.swift and Swift 3 "Ambiguous reference to member ==" in join
我正在开发一个使用 SQLite 数据库的 iOS 应用程序,我使用 SQLite.swift 库 (https://github.com/stephencelis/SQLite.swift)。
我正在尝试在 Swift 3 中迁移我的应用程序,因此我更改了我的库以使用分支 swift3-mariotaku
(https://github.com/stephencelis/SQLite.swift/tree/swift3-mariotaku)
我尝试使用 join
时仍然遇到一个问题:Ambiguous reference to member ==
这是我的代码:
class ArticlesDAO {
static let articles = Table("Article")
static let id = Expression<Int?>("id")
}
class FiltresVehiculesDAO {
let vfiltres = Table("VFiltre")
let idVehi = Expression<Int?>("vehicule")
func get(_ idVehicule: Int) throws -> [FiltreVehicule] {
let sqlQuery = vfiltres.join(
ArticlesDAO.articles,
// Next Line : "Ambiguous reference to member ==" error
on: vfiltres[idArticle] == ArticlesDAO.articles[ArticlesDAO.id]
)
//[...]
}
}
经过几次搜索,我找到了这个帖子 。所以我尝试在 on
参数中应用指定 return 类型的解决方案,如下所示:
on: (vfiltres[idArticle] == ArticlesDAO.articles[ArticlesDAO.id]) as Expression<Bool?>
我也尽量精确每一个元素:
on: ((vfiltres[idArticle] as Expression<Int?>) == (ArticlesDAO.articles[ArticlesDAO.id] as Expression<Int?>)) as Expression<Bool?>
错误依旧。
我查看了库代码,但我不知道如何解决这个问题,所以这是使用的库代码,也许它应该有助于理解:
join
方法:
public func join(_ table: QueryType, on condition: Expression<Bool>) -> Self {
return join(table, on: Expression<Bool?>(condition))
}
==
重载:
public func ==<V : Value>(lhs: Expression<V>, rhs: Expression<V>) -> Expression<Bool> where V.Datatype : Equatable {
return "=".infix(lhs, rhs)
}
String
扩展(用于 infix
方法):
extension String {
func infix<T>(_ lhs: Expressible, _ rhs: Expressible, wrap: Bool = true) -> Expression<T> {
let expression = Expression<T>(" \(self) ".join([lhs, rhs]).expression)
guard wrap else {
return expression
}
return "".wrap(expression)
}
func wrap<T>(_ expression: Expressible) -> Expression<T> {
return Expression("\(self)(\(expression.expression.template))", expression.expression.bindings)
}
func wrap<T>(_ expressions: [Expressible]) -> Expression<T> {
return wrap(", ".join(expressions))
}
}
感谢您的帮助
我找到了解决方案,我的问题不在 XCode 设计的线路中(我认为这可能是 Xcode 8 builder 中的问题)。
问题出在下一行,我没有更改 .leftOuter
中的 .LeftOuter
:
let sqlQuery = vfiltres
.join(
ArticlesDAO.articles,
on: ArticlesDAO.articles[ArticlesDAO.id] == vfiltres[idArticle]
)
.join(
.leftOuter, // was : .LeftOuter
DesignationsDAO.designations,
on: [...]
)
我正在开发一个使用 SQLite 数据库的 iOS 应用程序,我使用 SQLite.swift 库 (https://github.com/stephencelis/SQLite.swift)。
我正在尝试在 Swift 3 中迁移我的应用程序,因此我更改了我的库以使用分支 swift3-mariotaku
(https://github.com/stephencelis/SQLite.swift/tree/swift3-mariotaku)
我尝试使用 join
时仍然遇到一个问题:Ambiguous reference to member ==
这是我的代码:
class ArticlesDAO {
static let articles = Table("Article")
static let id = Expression<Int?>("id")
}
class FiltresVehiculesDAO {
let vfiltres = Table("VFiltre")
let idVehi = Expression<Int?>("vehicule")
func get(_ idVehicule: Int) throws -> [FiltreVehicule] {
let sqlQuery = vfiltres.join(
ArticlesDAO.articles,
// Next Line : "Ambiguous reference to member ==" error
on: vfiltres[idArticle] == ArticlesDAO.articles[ArticlesDAO.id]
)
//[...]
}
}
经过几次搜索,我找到了这个帖子 on
参数中应用指定 return 类型的解决方案,如下所示:
on: (vfiltres[idArticle] == ArticlesDAO.articles[ArticlesDAO.id]) as Expression<Bool?>
我也尽量精确每一个元素:
on: ((vfiltres[idArticle] as Expression<Int?>) == (ArticlesDAO.articles[ArticlesDAO.id] as Expression<Int?>)) as Expression<Bool?>
错误依旧。
我查看了库代码,但我不知道如何解决这个问题,所以这是使用的库代码,也许它应该有助于理解:
join
方法:
public func join(_ table: QueryType, on condition: Expression<Bool>) -> Self {
return join(table, on: Expression<Bool?>(condition))
}
==
重载:
public func ==<V : Value>(lhs: Expression<V>, rhs: Expression<V>) -> Expression<Bool> where V.Datatype : Equatable {
return "=".infix(lhs, rhs)
}
String
扩展(用于 infix
方法):
extension String {
func infix<T>(_ lhs: Expressible, _ rhs: Expressible, wrap: Bool = true) -> Expression<T> {
let expression = Expression<T>(" \(self) ".join([lhs, rhs]).expression)
guard wrap else {
return expression
}
return "".wrap(expression)
}
func wrap<T>(_ expression: Expressible) -> Expression<T> {
return Expression("\(self)(\(expression.expression.template))", expression.expression.bindings)
}
func wrap<T>(_ expressions: [Expressible]) -> Expression<T> {
return wrap(", ".join(expressions))
}
}
感谢您的帮助
我找到了解决方案,我的问题不在 XCode 设计的线路中(我认为这可能是 Xcode 8 builder 中的问题)。
问题出在下一行,我没有更改 .leftOuter
中的 .LeftOuter
:
let sqlQuery = vfiltres
.join(
ArticlesDAO.articles,
on: ArticlesDAO.articles[ArticlesDAO.id] == vfiltres[idArticle]
)
.join(
.leftOuter, // was : .LeftOuter
DesignationsDAO.designations,
on: [...]
)