簡體   English   中英

Swift 2.2字符串文字選擇器

[英]Swift 2.2 string literal selector

在更新之前,我的代碼工作正常:

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類確實具有這些屬性(lastName,firstName)。

但是我如何才能再次進行這項工作? 使用#selector進行的實驗沒有給我任何好處:它說“'#selector'的參數未引用初始化程序或方法”。 難怪因為此sectionForObject(,collat​​ionStringSelector :)除了屬性名外沒有其他方法。

這似乎是幾個問題的組合:

  • 排序規則必須使用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是包含此方法的實際類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM