Swift 4 - 对成员'>'的模糊引用(iOS 11)

时间:2017-10-02 10:08:19

标签: ios realm ios11 swift4 xcode9

转换为Swift 4语法后,我收到了这个误导性错误消息。

  

对成员'>'

的模糊引用

在这行代码上:

redCount = alerts!.filter { $0.dangerLevels.filter { $0.level.value == 4 }.count > 0 }.count

完整的上下文代码:

alerts = realm.objects(Alerts).filter(NSPredicate(format: "department != nil")).sorted(byKeyPath: "departmentNumber")

redCount = alerts!.filter { $0.dangerLevels.filter { $0.level.value == 4 }.count > 0 }.count

错误消息根本不明确,我可以提供一些提示吗?

请注意,提醒的类型为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 { $0.dangerLevels.contains { ($0.level.value as! Int) == 4 } }.count

enter image description here

2 个答案:

答案 0 :(得分:2)

value是一种通用方法,当与文字(即没有定义类型的东西)进行比较时,编译器有一个问题要弄清楚要推断出哪种类型。一种解决方法是将as Int添加到表达式的一侧:

(为了便于阅读而稍作重写)

let alerts = realm.objects(Alerts).filter(NSPredicate(format: "department != nil")).sorted(byKeyPath: "departmentNumber")

let isRedLevel: (DangerLevel) -> Bool = { dangerLevel in
   ($0.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

答案 1 :(得分:0)

我找到了一个简单的解决方案,因为我似乎无法正确使用结果&lt;&gt;和列表&lt;&gt;将我的代码转换为实际的Swift语法后,Realm中的类型(这是一个用Swift 2编写的旧项目)。

我只是使用数组。

let alerts = realm.objects(Alerts).filter(NSPredicate(format: "department != nil")).sorted(byKeyPath: "departmentNumber")
let alertArray = Array(alerts!)

现在我可以在此类型上正确过滤:

redCount = alertArray.filter { $0.dangerLevels.filter { $0.level.value == 4 }.count > 0 }.count

它最终编译并正常工作。

随意建议编辑更现代的Swift语法和/或适当的答案。

感谢@Sulthan在评论中提供的帮助和建议。