【问题标题】:Swift 2.2 string literal selectorSwift 2.2 字符串文字选择器
【发布时间】: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:) 不采用任何方法,只采用一个属性名称。

【问题讨论】:

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

标签: ios swift cocoa uilocalizedcollation


【解决方案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'类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 2018-07-14
  • 1970-01-01
相关资源
最近更新 更多