Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 基于两个约束的排序词典_Ios_Swift_Sorting_Dictionary_Anonymous Function - Fatal编程技术网

Ios 基于两个约束的排序词典

Ios 基于两个约束的排序词典,ios,swift,sorting,dictionary,anonymous-function,Ios,Swift,Sorting,Dictionary,Anonymous Function,我试图根据两个约束对字典中的值(单词对象)进行排序。Word对象有两个相关字段:Int:count和Bool:pinted。这些约束条件如下:首先,如果单词被固定(即value.pinted=true),我希望单词在排序数组中首先出现,而不管其计数字段如何。如果单词未固定,则我希望根据其count值和其他未固定单词之间的降序排列单词 我最终实现了如下排序功能: sortedWordsArr = wordsDict.sorted { if $0.value.pinned {

我试图根据两个约束对字典中的值(单词对象)进行排序。Word对象有两个相关字段:
Int:count
Bool:pinted
。这些约束条件如下:首先,如果单词被固定(即
value.pinted=true
),我希望单词在排序数组中首先出现,而不管其
计数
字段如何。如果单词未固定,则我希望根据其
count
值和其他未固定单词之间的降序排列单词

我最终实现了如下排序功能:

sortedWordsArr = wordsDict.sorted {
    if $0.value.pinned {
        return $0.value.pinned && !$1.value.pinned
    } else {
        return $0.value.count > $1.value.count
    }
}
然而,这似乎不起作用。当我锁定单词时,它们不会移动到数组的开头。他们似乎是随机游荡,有时甚至根本不是。我浏览过一些论坛,这些论坛似乎回答了如何使用多个约束进行排序的问题,但我仍然不太确定如何为我的约束设置
sorted
闭包

在我看来,第一个条件:
返回$0.value.pinted&&$1.value.pinted
将固定的单词
$0
与不一定固定的对象
$1
进行比较,因为
$1
只是指定为另一个单词,在我的字典中不一定是固定的。这种想法是错误的吗?如果是这样,如何根据这些约束对词典进行正确排序


感谢您阅读本帖-感谢您的帮助

您可以扩展
Bool
以返回一个
,该值类似于
true
1
false
0
,只需比较一个元组即可使用降序对它们进行排序。请注意,这将按降序对正确的固定元素进行排序,我不确定您是否要排序:




如果要保持固定值的原始计数顺序。请注意,字典是无序的集合:

let sorted = wordsDict.sorted(by: {
    if $0.value.pinned { return true }
    if !$0.value.pinned && $1.value.pinned { return false }
    return $0.value.count > $1.value.count
})
三元运算符语法的使用

let sorted = wordsDict.sorted(by: {
    $0.value.pinned ? true :
    !$0.value.pinned && $1.value.pinned ? false :
    $0.value.count > $1.value.count
})

谢谢你的回答!对于第一个排序函数,对元组排序的协议是什么?它是否首先基于第一个条目(
$0.value.pinted.value<$1.value.pinted.value
)进行排序,然后如果该条目相同,则基于第二个条目进行排序?@rjc810元组是
可比的
,因为Swift 3 AFAIR的所有元素都符合
可比的
。它最多有6个元素
Bool
不符合
compariable
这就是我向它们添加值
Int
的原因。它将比较第一个元素,如果它们相等,它将比较下一个元素,依此类推
let sorted = wordsDict.sorted(by: {
    if $0.value.pinned { return true }
    if !$0.value.pinned && $1.value.pinned { return false }
    return $0.value.count > $1.value.count
})
let sorted = wordsDict.sorted(by: {
    $0.value.pinned ? true :
    !$0.value.pinned && $1.value.pinned ? false :
    $0.value.count > $1.value.count
})