2016-03-25 8 views
1

アップデートする前に、私はこのコードがうまく働きました。スウィフト2.2文字列リテラルセレクタ

文字列リテラルセレクタをセレクタ( "lastName")に変更しようとしましたが、 'index'は常に-1として返されます。私には解決策はありません。

この照合メソッドは、指定されたオブジェクトのプロパティ名をとります。そして、Personクラスは本当にそれらのプロパティ(lastName、firstName)を持っています。

しかし、どうすればこの作品を再び手に入れることができますか? #selectorを使った実験では、私には何も与えませんでした。 '' #selector 'の引数は、初期化子またはメソッドを参照していません。このsectionForObject(、collat​​ionStringSelector :)はメソッドを持ちませんが、プロパティ名を取るので不思議ではありません。

+1

マットのものも良い読書です:http://stackoverflow.com/a/35658335/2227743 – Moritz

+0

私はそれを見ましたが、私の場合はどのように役立つか分かりません。私の場合、セレクタとしてのメソッドは必要ありませんが、何らかのソートのためのプロパティ名が必要です。そして、私はこのセレクタを書く構文に関係なく、新しい構文は既存のメソッド名を必要とし、文字列リテラルを必要としないので動作しません。 –

+0

[sectionForObject](https://developer.apple.com/library/ios/documentation/iPhone/Reference/UILocalizedIndexedCollat​​ion_Class/index.html#//apple_ref/occ/instm/UILocalizedIndexedCollat​​ion/sectionForObject:collat​​ionStringSelector :)はセレクタをとりますこれは、 "照合に使用されるオブジェクトの識別文字列を返すメソッドを識別する"ので、Module.Class.methodを使用すると動作するはずです(おそらくクラス内でプロパティを使用する代わりにプロパティを返すメソッドが必要です新しい構文はないことについて確認してください) – Moritz

答えて

4

いくつかの問題の組み合わせのようだ:

  • 照合が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)を使用することができる:ここ

は期待どおりに動作するように思われる自己完結型の例です。

+0

素敵なタッチ!どうもありがとう!しかし、私はまだ、アップルがこの#セレクタの混乱でスウィフト開発で間違った方法を変えたと思う。 –

0

まず、Swift2.2のセレクタに関する新しいドキュメントを読んでください。

例:Selector("lastName")の代わりに#selector(CLASS.lastName)を使用してください。 CLASSの場合は、このメソッドを含む実際のクラスです。

+2

私もそれを試みました。そして、私が得るのはこれです:インスタンスメンバー 'lastName'は 'Person'型では使用できません。 –

関連する問題