Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.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 NSSortDescriptor在Swift中_Ios_Swift - Fatal编程技术网

Ios NSSortDescriptor在Swift中

Ios NSSortDescriptor在Swift中,ios,swift,Ios,Swift,我正在开发一个iOS应用程序,我将CoreData中存储的数据加载到UITableView中。数据实体有一个名为id的属性,该属性是一个字符串,包含一个a,后跟一个数字(即“A1”、“A2”等) 当我使用此代码进行排序时,最终会按照字典顺序对表进行排序(即“A1”“A10”“A11”“A12”“A2”“A3”等) 我真正想要的是它被数字排序,正如你可能期望的那样。我该怎么做呢?我知道可以将一个NSComparator作为参数添加到nssortddescriptor中,但我一辈子都搞不清楚。提前感

我正在开发一个iOS应用程序,我将CoreData中存储的数据加载到UITableView中。数据实体有一个名为
id
的属性,该属性是一个字符串,包含一个
a
,后跟一个数字(即“A1”、“A2”等)

当我使用此代码进行排序时,最终会按照字典顺序对表进行排序(即“A1”“A10”“A11”“A12”“A2”“A3”等)

我真正想要的是它被数字排序,正如你可能期望的那样。我该怎么做呢?我知道可以将一个
NSComparator
作为参数添加到
nssortddescriptor
中,但我一辈子都搞不清楚。提前感谢您的帮助

快捷方式:

var arr = ["A1", "A10", "A11", "A12", "A2", "A3"]
arr.sort {dropFirst($0).toInt() < dropFirst($1).toInt()}
var arr=[“A1”、“A10”、“A11”、“A12”、“A2”、“A3”]
arr.sort{dropFirst($0.toInt()
因此,您可以直接使用它,或者将其用作比较器块的基础。如果您坚持在有效的Objective-C中执行此操作,则可以使用NSString
compare:options:
,其中
选项:
包括
NSNumericSearch

核心数据获取请求中的排序描述符 使用自定义比较器,仅使用有限的“内置”比较 方法。这记录在 在“核心数据编程指南”中:

。。。另一方面,SQL存储区编译谓词和排序 将描述符转换为SQL并在数据库本身中计算结果。 这主要是为了表现,但这意味着评估 在非Cocoa环境中发生,因此排序描述符(或 依赖Cocoa的谓词(谓词)无法工作。支持的排序 选择器是
比较:
不区分大小写比较:
本地化比较:
LocalizedCase不敏感比较:
,和
localizedStandardCompare:
(以下简称 后者是类似查找器的排序,也是大多数人最应该使用的 时间)。此外,不能使用对瞬态属性进行排序 SQLite商店

幸运的是,有一个应该适合您的需要:

let sortDescriptor = NSSortDescriptor(key: "id", ascending: true,
                       selector: "localizedStandardCompare:")
localizedStandardCompare:
执行“类似查找器”的比较和 特别是根据字符串中的数字的大小来处理字符串中的数字 数值

对于Swift 2.2/Xcode 7.3及更高版本:

let sortDescriptor = NSSortDescriptor(key: "id", ascending: true
                         selector: #selector(NSString.localizedStandardCompare))

Swift 3

让sortDescriptor=NSSortDescriptor(键:“id”,升序:true,选择器:#选择器(NSString.localizedCaseInsensitiveCompare))

希望它对Swift3有所帮助

关键是

result: Bool = 0 < "string1".localizedCompare("string2").rawValue
result:Bool=0
像这样使用

[some string array].sorted { return 0 < "string1".localizedCompare("string2").rawValue }
[某些字符串数组].sorted{return 0<“string1.localizedCompare(“string2”).rawValue}

为什么要麻烦使用obj-c风格的
NSSortDescriptor
,在swift中,我们可以使用swift高阶函数进行很好的排序-xcode 8.x swift 3.x

class Person: NSObject {
    let firstName: String
    let lastName: String
    let age: Int

    init(firstName: String, lastName: String, age: Int) {
        self.firstName = firstName
        self.lastName = lastName
        self.age = age
    }
    override var description: String {
        return "\(firstName) \(lastName)"
    }
}

let a = Person(firstName: "a", lastName: "b", age: 24)
let b = Person(firstName: "c", lastName: "d", age: 27)
let c = Person(firstName: "e", lastName: "f", age: 33)
let d = Person(firstName: "g", lastName: "h", age: 31)
let peopleObject = [d, b, a, c]
//SWIFTY
let sortedByFirstNameSwifty =  peopleObject.sorted(by: { $0.firstName < $1.firstName })
print(sortedByFirstNameSwifty)//prints[a b, c d, e f, g h]


//Objective c way
let firstNameSortDescriptor = NSSortDescriptor(key: "firstName", ascending: true, selector: #selector(NSString.localizedStandardCompare(_:)))
let sortedByFirstName = (peopleObject as NSArray).sortedArray(using: [firstNameSortDescriptor])
print(sortedByFirstName)//prints [a b, c d, e f, g h]
类人员:NSObject{
让firstName:String
让lastName:String
年龄:Int
init(firstName:String,lastName:String,age:Int){
self.firstName=firstName
self.lastName=lastName
self.age=年龄
}
覆盖变量说明:字符串{
返回“\(姓氏)\(姓氏)”
}
}
让a=人(姓:“a”,姓“b”,年龄:24岁)
let b=人(姓:“c”,姓“d”,年龄:27岁)
设c=人(姓“e”,姓“f”,年龄:33岁)
设d=人(姓:“g”,姓“h”,年龄:31岁)
让peopleObject=[d,b,a,c]
//迅捷的
让sortedByFirstNameSwifty=peopleObject.sorted(排序依据:{$0.firstName<$1.firstName})
print(sortedByFirstNameSwifty)//prints[ab,cd,ef,gh]
//目标c方式
让firstNameSortDescriptor=NSSortDescriptor(键:“firstName”,升序:true,选择器:#选择器(NSString.localizedStandardCompare(:))
让sortedByFirstName=(peopleObject作为NSArray)。sortedArray(使用:[firstNameSortDescriptor])
print(sortedByFirstName)//打印[ab,cd,ef,gh]
适用于swift 4.2

您可以使用
NSSortDescriptor

let descriptor: NSSortDescriptor = NSSortDescriptor(key: "lastMessageDate", ascending: false)
let sortedResults = arrChatDialogs?.sortedArray(using: [descriptor])

您可以使用默认排序函数对对象集合进行排序,如下所示:

e、 g.您的对象数组如下所示

data = [
    {
        name: "Naresh",
        dept: "CSC",
        id: 102
    },
    {
        name: "Rahul",
        dept: "CSC",
        id: 101
    },
    {
        name: "Amar",
        dept: "CSC",
        id: 100
    }
]

//Comparing string key
let sortByName = data.sorted { (model1, model2) -> Bool in
        return (model1.name.localizedCompare(model2.name) == ComparisonResult.orderedAscending)
}

/* The ComaprisonResult is default enum whose possible cases are: */
public enum ComparisonResult : Int {
    case orderedAscending
    case orderedSame
    case orderedDescending
}

/*** SORTING ACCORDING TO NUMERICAL VALUE ***/

//Comparing digit key including Int, Double, Float & all
let sortByNumber = data.sorted { (model1, model2) -> Bool in
            return model1.id < model2.id
}

//You can use the shot form of automatic closure as:
let sortByNumber = data.sorted { $0.id > $1.id }

//In the autoclosure the $0 represent first parameter, $1 represent second parameter. The return statement is optional if closure or functions contains only single statement.
数据=[
{
名称:“纳雷什”,
部门:“CSC”,
身份证号码:102
},
{
姓名:“Rahul”,
部门:“CSC”,
身份证号码:101
},
{
姓名:“阿马尔”,
部门:“CSC”,
身份证号码:100
}
]
//比较字符串键
让sortByName=data.sorted{(model1,model2)->Bool进入
return(model1.name.localizedCompare(model2.name)==ComparisonResult.OrderedAscing)
}
/*ComaprisonResult是默认枚举,其可能的情况为:*/
公共枚举比较结果:Int{
案例排序
案例顺序相同
案例顺序设计
}
/***按数值排序***/
//比较数字键,包括Int、Double、Float和all
让sortByNumber=data.sorted{(model1,model2)->Bool进入
返回model1.id$1.id}
//在自动关闭中,$0表示第一个参数,$1表示第二个参数。如果闭包或函数只包含一条语句,则返回语句是可选的。

这可以在获取数据后对数据进行排序,但不能作为核心数据获取请求中的排序描述符。这正是我所需要的。非常感谢。新格式似乎是。。NSSortDescriptor(键:“id”,升序:true,选择器:#选择器(NSString.localizedCompare(:))所以,如果我理解正确的话。SortDescriptor带有3个重载,包含comparator的重载不能与CoreData一起使用?@DanBeaulieu:是的,基于选择器的重载只能与固定的描述符列表一起使用。原因是谓词(包括排序描述符)被转换为SQLite查询链接更新,谢谢你让我k
data = [
    {
        name: "Naresh",
        dept: "CSC",
        id: 102
    },
    {
        name: "Rahul",
        dept: "CSC",
        id: 101
    },
    {
        name: "Amar",
        dept: "CSC",
        id: 100
    }
]

//Comparing string key
let sortByName = data.sorted { (model1, model2) -> Bool in
        return (model1.name.localizedCompare(model2.name) == ComparisonResult.orderedAscending)
}

/* The ComaprisonResult is default enum whose possible cases are: */
public enum ComparisonResult : Int {
    case orderedAscending
    case orderedSame
    case orderedDescending
}

/*** SORTING ACCORDING TO NUMERICAL VALUE ***/

//Comparing digit key including Int, Double, Float & all
let sortByNumber = data.sorted { (model1, model2) -> Bool in
            return model1.id < model2.id
}

//You can use the shot form of automatic closure as:
let sortByNumber = data.sorted { $0.id > $1.id }

//In the autoclosure the $0 represent first parameter, $1 represent second parameter. The return statement is optional if closure or functions contains only single statement.