Swift 2.2 строковый литерал
До обновления у меня этот код работал нормально:
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 на Selector("lastName"), но "index" всегда возвращается как -1. И я не вижу никакого решения.
Этот метод сопоставления принимает имя свойства данного объекта. И класс Person действительно имеет эти свойства (lastName, firstName).
Но как я могу получить эту работу снова? Эксперименты с #selector ничего не дали мне: "Аргумент" #selector "не относится к инициализатору или методу", - говорит он. Неудивительно, так как этот sectionForObject(, collationStringSelector:) не принимает никаких методов, кроме имен свойств.
2 ответа
Кажется, это сочетание нескольких проблем:
- Сортировка должна быть создана с
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)
может быть использован.
Для решения вашей проблемы сначала прочитайте новую документацию по Селекторам в Swift2.2.
Пример: использование #selector(CLASS.lastName)
вместо Selector("lastName")
, Где CLASS это фактический класс, который содержит этот метод.