【问题标题】:Swift sorted by error: Cannot convert value of type 'CGFloat?' to expected argument type 'Self'Swift 按错误排序:无法转换“CGFloat”类型的值?到预期的参数类型'Self'
【发布时间】:2020-10-14 01:14:03
【问题描述】:

这是自定义对象:

struct ScannedFacts {
    var result = -1
    var frame:CGRect? = nil
    var name = ""
}

这是我想要对以下类型的数组进行排序的函数:

func getSortedData(data:[(String, ScannedFacts)]) -> [(String, ScannedFacts)] {
    return data.sorted(by: {$0.1.frame?.minX < $1.1.frame?.minX})
}

这是我得到的错误,我真的无法弄清楚:

Cannot convert value of type 'CGFloat?' to expected argument type 'Self'

我在这里错过了什么?

【问题讨论】:

  • 不要使用-1""等作为虚拟值来表示“没有价值”。这就是nil 的用途。一方面,当您实际上得到-1 结果时会发生什么?
  • 查看stackoverflow.com/q/44808391/3141234 我的nilComparator 正是可以解决您的问题的方法,没有与选择默认值来代替nil 相关的所有错误/错误

标签: ios arrays swift sorting swift3


【解决方案1】:

比较值时需要使用CGFloat,而不是CGFloat?

为了更容易,您可以使用计算属性:

struct ScannedFacts {
    var frame:CGRect? = nil

    var frameMinX: CGFloat {
        // assume we treat `nil` the same way as `0`
        frame?.minX ?? 0
    }
}
return data.sorted { $0.1.frameMinX < $1.1.frameMinX }

【讨论】:

  • 纠正自己,这不是编译: var frameMinX: CGFloat: { frame?.minX ?? 0 }
  • @Itzik984 在 Swift 3 中删除了比较选项:Remove Optional Comparison Operators。这意味着您只能使用未包装的选项,除非您创建自己的扩展。
  • @pawello2222 不要在默认值后面隐藏可选项,因为您正在破坏可选项的整个点,即为 API 的使用者提供几个方便的选项来决定对于他们自己来说,他们想要如何处理nil?? 0 可能是一种方式,但强制展开、使用不同的值、传播 nil 等都是有效的选项。不要采取呼叫者能力选择的方式。你怎么知道frameMinX == 0的意思是“一个非零值,它的值实际上是0”和“nil”。
  • @Alexander-ReinstateMonica 我同意。我刚刚展示了一种方法。计算属性是 this 用例的 convenience 方法。
  • @pawello2222 我认为你应该清楚地传达这个警告,否则人们会得到错误的想法。我们对这个用例知之甚少。您的代码隐式编码了一个决定,即0 代表nil,并且nil 和真正的0 应该位于排序顺序的中间,这很奇怪。
【解决方案2】:

ScannedFact 中的frame 属性是可选的,因此当没有任何可用框架或框架属性为nil 时,您可能需要提供默认值。您无法对比较 nil 的两个对象进行排序,因此您需要解包或提供默认值,如下所示:

func getSortedData(data:[(String, ScannedFacts)]) -> [(String, ScannedFacts)] {
    return data.sorted(by: {$0.1.frame?.minX ?? 0 < $1.1.frame?.minX ?? 0 })
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多