如何在Swift对象数组中查找具有最小属性值的对象?

3

我有一个Place类的以下对象数组:

class Place: NSObject {
    var distance:Double = Double()
    init(_ distance: Double) {
        self.distance = distance
    }
}


let places = [Place(1.5), Place(8.4), Place(4.5)]

我需要获取距离最小的地点。 我尝试使用

let leastDistancePlace = places.min { $0.distance > $1.distance }

按照这里类似问题的回答,但是出现了以下错误。

上下文闭包类型“(Place) -> _”期望 1 个参数,但在闭包体中使用了2个

附注:

根据@robmayoff的回答,在playground中尝试了以下代码,但仍然报错:

Type[Place]的值没有成员min

请查看此截图。enter image description here

我的Swift版本是:Apple Swift version 2.2 (swiftlang-703.0.18.8 clang-703.0.31)


2
你应该使用maxmin(如所引用的答案中所示),而不是map - Martin R
1
“它不起作用”是不够的信息。它是如何失败的?您是否收到编译时错误?您是否收到运行时错误?它是否能够编译和运行,但产生了错误的答案?请编辑您的问题并包含这些详细信息。 - rob mayoff
1
顺便提一下,在你的尝试中,你使用了 places.map,但你链接的答案中使用了 places.max。也许你是想要说 places.min - rob mayoff
2
为什么你在引用的答案上“留下评论”(https://dev59.com/-14c5IYBdhLWcg3weaT8#50ocoYgBc1ULPQZFkZeJ),说“应该使用map”,然后又提出一个新问题说“map不起作用”? - Martin R
1
我已将您更新的代码复制到一个新的Xcode 8.2.1/Swift 3项目中,它可以编译(并运行)没有问题。 - Martin R
显示剩余7条评论
3个回答

17
let leastDistancePlace = places.min { $0.distance < $1.distance }
或者
let leastDistancePlace = places.min(by: { $0.distance < $1.distance })

例子:

:; xcrun swift
"crashlog" and "save_crashlog" command installed, use the "--help" option for detailed help
Welcome to Apple Swift version 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1). Type :help for assistance.
  1>     class Place { 
  2.         var distance:Double = Double() 
  3.         init(_ distance: Double) { 
  4.             self.distance = distance 
  5.         } 
  6.     } 
  7.  
  8.  
  9.     let places = [Place(1.5), Place(8.4), Place(4.5)] 
 10.     let leastDistancePlace = places.min { $0.distance < $1.distance }
places: [Place] = 3 values {
  [0] = {
    distance = 1.5
  }
  [1] = {
    distance = 8.4000000000000004
  }
  [2] = {
    distance = 4.5
  }
}
leastDistancePlace: Place? = (distance = 1.5) {
  distance = 1.5
}
 11>  

请检查更新后的问题。它非常奇怪。我相信你的解决方案应该有效,但实际上并没有。 - toing_toing
3
在Swift 2.2中,应该使用minElement而不是min。你真的应该升级到Swift 3和最新版本的Xcode。 - vacawama

1
let sortedPlaces = places.sorted(by: { $0.distance < $1.distance })
let first = sortedPlace.first

只需使用sort


5
如果你仅需要最小(或最大)的元素,则使用max/min函数要比对数组进行排序更有效率。 - Martin R
3
min(by:)。时间复杂度为O(n),而不是O(nlog(n))。 - Hamish
1
哦,我的错,忘记了min =) - Daivest

1
您的问题措辞不够清晰,但我认为我知道您想问什么。映射函数通常用于转换:
let distances = places.map({ (place: Place) -> Int in
    place.distance
})

缩写

let distances = places.map({ $0.distance }) 

您可以使用最大值或最小值函数来提取所需的整数值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接