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(, collationStringSelector:) 不采用任何方法,只采用一个属性名称。
【问题讨论】:
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 字符串文字选择器的主要内容,如果未能解决你的问题,请参考以下文章