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 это фактический класс, который содержит этот метод.

Другие вопросы по тегам