Swift 2.2 字符串文字选择器

Posted

技术标签:

【中文标题】Swift 2.2 字符串文字选择器【英文标题】:Swift 2.2 string literal selector 【发布时间】:2016-03-25 11:18:48 【问题描述】:

在更新之前,我这段代码运行良好:

var alphabetizedArray = [[Person]]()

    let collation = UILocalizedIndexedCollation()

    for person : Person in ContactsManager.sharedManager.contactList 
        var index = 0
        if ContactsManager.sharedManager.sortOrder == .FamilyName 
            index = collation.sectionForObject(person, collationStringSelector: "lastName")
        
        else 
            index = collation.sectionForObject(person, collationStringSelector: "firstName")
        
        alphabetizedArray.addObject(person, toSubarrayAtIndex: index)
    

但是现在由于不再允许使用字符串文字选择器,因此代码损坏了。

我尝试将字符串文字选择器更改为 Selector("lastName"),但“索引”始终返回为 -1。而且我没有看到任何解决方案。

此排序方法采用给定对象的属性名称。而 Person 类确实具有这些属性(姓氏、名字)。

但是我怎样才能再次获得这项工作呢? #selector 的实验没有给我任何帮助:“'#selector' 的参数不指代初始化程序或方法”它说。难怪这 sectionForObject(, collat​​ionStringSelector:) 不采用任何方法,只采用一个属性名称。

【问题讨论】:

matt 的也不错:***.com/a/35658335/2227743 我已经看到了,但我看不出它对我的情况有何帮助。在我的情况下,我不需要方法作为选择器,而是某种排序的属性名称。而且无论我用什么语法编写这个选择器,它都不起作用,因为新语法需要现有的方法名称而不是字符串文字。 但是sectionForObject 采用一个选择器,该选择器“标识返回用于排序规则的对象的标识字符串的方法”,因此使用 Module.Class.method 应该可以工作(也许在你的类中你必须有一个返回属性的方法,而不是仅仅尝试使用新语法的属性?不确定。) 我在我的 Person 类 class func lastNameString() -> String return "lastName" 中编写了一个测试函数,然后我将选择器更改为这个 #selector(Person.lastNameString)。但是现在我因为发送到实例的错误无法识别的选择器而崩溃。这是一个谜。 您是否尝试过 Module.Class.method 而不仅仅是 Class.method?只是一个猜测。确实有些玄机。如果您实际上找不到此特定问题的解决方案,我将重新打开它。 【参考方案1】:

这似乎是几个问题的组合:

必须使用UILocalizedIndexedCollation.currentCollation() 创建排序规则。 对象类需要一个返回String实例方法#selector 必须引用该实例方法,#selector(<Type>.<method>)#selector(<instance>.<method>) 都可以使用。

这是一个独立的示例,似乎可以按预期工作:

class Person : NSObject 
    let firstName : String
    let lastName : String

    init(firstName : String, lastName : String) 
        self.firstName = firstName
        self.lastName = lastName
    

    func lastNameMethod() -> String 
        return lastName
    

然后

let person = Person(firstName: "John", lastName: "Doe")
let collation = UILocalizedIndexedCollation.currentCollation()
let section = collation.sectionForObject(person, collationStringSelector: #selector(Person.lastNameMethod))
print(section) // 3

这里#selector(Person.lastNameMethod)#selector(person.lastNameMethod)都可以使用。

【讨论】:

手感不错!非常感谢!但我仍然认为 Apple 在 Swift 开发中出现了这种#selector 的混乱局面。【参考方案2】:

为了解决您的问题,请首先阅读有关 Swift2.2 中选择器的新文档。

示例:使用#selector(CLASS.lastName) 而不是Selector("lastName")。其中 CLASS 是包含此方法的实际类。

【讨论】:

我也试过了。我得到的只是:实例成员'lastName'不能用于'Person'类型。

以上是关于Swift 2.2 字符串文字选择器的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3.0 字符串问题

不推荐使用 Objective-C 选择器的字符串文字,改用 '#selector'

无法识别的选择器发送到实例 - Swift

Swift 中的文档选择器视图控制器问题

关于Jquery index()方法的文字详细解析

如何在 Swift UIKit Map 组件中处理 SwiftUI 中的触摸手势?