Swift 4 - 对成员“>”的引用不明确 (iOS 11)
Swift 4 - Ambigous reference to member '>' (iOS 11)
我在转换为 Swift 4 语法后收到此误导性错误消息。
Ambiguous reference to member '>'
关于这行代码:
redCount = alerts!.filter { [=12=].dangerLevels.filter { [=12=].level.value == 4 }.count > 0 }.count
完整上下文代码:
alerts = realm.objects(Alerts).filter(NSPredicate(format: "department != nil")).sorted(byKeyPath: "departmentNumber")
redCount = alerts!.filter { [=13=].dangerLevels.filter { [=13=].level.value == 4 }.count > 0 }.count
错误信息一点都不明确,我能得到一些提示吗?
请记住 alerts 的类型是 Results<Alert>?
和dangerLevel声明如下:let dangerLevels = List<DangerLevel>()
编辑:
这里有一些关于闭包内部类型的附加信息。
let level = RealmOptional<Int>()
值来自 RealmOptional
public var value: T? {
get {
return underlyingValue.map(dynamicBridgeCast)
}
set {
underlyingValue = newValue.map(dynamicBridgeCast)
}
}
编辑 2: 我重写了语法以提高可读性,但这是我的结果:
redCount = alerts!.filter { [=16=].dangerLevels.contains { ([=16=].level.value as! Int) == 4 } }.count
value
是一种通用方法,当与文字(即没有定义类型的东西)进行比较时,编译器无法确定在那里推断出什么类型。一种解决方法是将 as Int
添加到表达式的一侧:
(为了便于阅读而略微重写)
let alerts = realm.objects(Alerts).filter(NSPredicate(format: "department != nil")).sorted(byKeyPath: "departmentNumber")
let isRedLevel: (DangerLevel) -> Bool = { dangerLevel in
([=10=].level.value as Int) == 4
}
let hasRedLevels: (Alert) -> Bool = { alert in
alert.dangerLevels.contains(where: isRedLevel)
}
redCount = alerts!.filter(hasRedLevels).count
也可以定义一个常量:
let redAlertType: Int = 4
并使用它代替文字 4
。
我找到了一个简单的解决方案,因为在将我的代码转换为实际 Swift 语法后,我似乎无法正确使用 Realm 中的 Results<> 和 List<> 类型(这是一个旧项目在 Swift 2)。
我只是用了一个数组。
let alerts = realm.objects(Alerts).filter(NSPredicate(format: "department != nil")).sorted(byKeyPath: "departmentNumber")
let alertArray = Array(alerts!)
现在我可以正确过滤这种类型了:
redCount = alertArray.filter { [=11=].dangerLevels.filter { [=11=].level.value == 4 }.count > 0 }.count
它终于编译并正常工作了。
欢迎提出更现代的 Swift 语法 and/or 适当答案的编辑建议。
感谢@Sulthan 在评论中的帮助和建议。
我在转换为 Swift 4 语法后收到此误导性错误消息。
Ambiguous reference to member '>'
关于这行代码:
redCount = alerts!.filter { [=12=].dangerLevels.filter { [=12=].level.value == 4 }.count > 0 }.count
完整上下文代码:
alerts = realm.objects(Alerts).filter(NSPredicate(format: "department != nil")).sorted(byKeyPath: "departmentNumber")
redCount = alerts!.filter { [=13=].dangerLevels.filter { [=13=].level.value == 4 }.count > 0 }.count
错误信息一点都不明确,我能得到一些提示吗?
请记住 alerts 的类型是 Results<Alert>?
和dangerLevel声明如下:let dangerLevels = List<DangerLevel>()
编辑:
这里有一些关于闭包内部类型的附加信息。
let level = RealmOptional<Int>()
值来自 RealmOptional
public var value: T? {
get {
return underlyingValue.map(dynamicBridgeCast)
}
set {
underlyingValue = newValue.map(dynamicBridgeCast)
}
}
编辑 2: 我重写了语法以提高可读性,但这是我的结果:
redCount = alerts!.filter { [=16=].dangerLevels.contains { ([=16=].level.value as! Int) == 4 } }.count
value
是一种通用方法,当与文字(即没有定义类型的东西)进行比较时,编译器无法确定在那里推断出什么类型。一种解决方法是将 as Int
添加到表达式的一侧:
(为了便于阅读而略微重写)
let alerts = realm.objects(Alerts).filter(NSPredicate(format: "department != nil")).sorted(byKeyPath: "departmentNumber")
let isRedLevel: (DangerLevel) -> Bool = { dangerLevel in
([=10=].level.value as Int) == 4
}
let hasRedLevels: (Alert) -> Bool = { alert in
alert.dangerLevels.contains(where: isRedLevel)
}
redCount = alerts!.filter(hasRedLevels).count
也可以定义一个常量:
let redAlertType: Int = 4
并使用它代替文字 4
。
我找到了一个简单的解决方案,因为在将我的代码转换为实际 Swift 语法后,我似乎无法正确使用 Realm 中的 Results<> 和 List<> 类型(这是一个旧项目在 Swift 2)。
我只是用了一个数组。
let alerts = realm.objects(Alerts).filter(NSPredicate(format: "department != nil")).sorted(byKeyPath: "departmentNumber")
let alertArray = Array(alerts!)
现在我可以正确过滤这种类型了:
redCount = alertArray.filter { [=11=].dangerLevels.filter { [=11=].level.value == 4 }.count > 0 }.count
它终于编译并正常工作了。
欢迎提出更现代的 Swift 语法 and/or 适当答案的编辑建议。
感谢@Sulthan 在评论中的帮助和建议。