2016-05-16 4 views
4

Swift 1をSwift 2.0に更新した後、問題が発生しました。Swift 2.0 Objective-Cでパラメータの型を表現できないため、メソッドに@objcを設定できません

私はこのコードの最初の行に次のエラーを取得しています:

パラメータの種類はObjective-Cで表すことができないため、メソッドが@objcマークを付けることはできません

@objc func personsToFirstStep(persons: [Person]) { 
    for person in persons { 
     if !self.persons.contains(person) && person.id != userID { 
      self.persons.append(person) 
     } 
    } 

    collectionView.reloadData() 
    collectionViewPlaceholder.hidden = true 
    collectionView.hidden = false 
    collectionGradientView.hidden = false 
} 

この本Personクラス:I cはこれより少ない情報で

class Person: Hashable { 

    var intID: Int = 0 
    var id: String = "" 
    var name: String = "" 
    var type: String = "" 

    var hashValue: Int { 
     return self.intID 
    } 

    init(id: String, name: String, type: String) { 
     self.id = id 
     self.intID = Int(id)! 
     self.name = name 
     self.type = type 
    } 

} 

func ==(lhs: Person, rhs: Person) -> Bool { 
    return lhs.intID == rhs.intID 
} 
+0

にそれを変更しましたか? – Dare

+7

'Person'とは何ですか?コメントやスクリーンショットとして投稿するのではなく、あなたのコードで[編集する](http://stackoverflow.com/posts/37256261/edit)をクリックしてください。スクリーンショットは、どこに問題があるのか​​を示すのに役立ちますが、実際のコードを置き換えるべきではありません。外部リンクが壊れやすく、他の人が簡単に使用できないためです。 – Hamish

+0

Personはクラスです) – Oleksandr

答えて

13

あなたは非常にうまく問題を自分で説明しています

class Person: Hashable { 

人はNSObjectのではありません。しかし、Objective-CではNSObjectから派生したクラス型しか見ることができません。したがって、あなたのPersonタイプはObjective-Cには見えません。しかし、あなたの@objc func宣言は、Personの配列をとる関数用です。私たちはPersonがObjective-Cには見えないと言っています。だからあなたの@objc func宣言は違法です。 Objective-Cは、そのパラメータを表示することができないため、この関数を表示することはできません。

あなたはこのように開始するには、あなたのクラス宣言を変更する必要があります

class Person: NSObject { 

...とは、あなたはもちろんのクラスの実装に必要な任意の更なる調整を行う必要がある場合があります。しかし、その変更はあなたの@objc func宣言を合法にするでしょう。 (NSObjectのハッシュ可能なので、この適応を作るために必要な作業量が非常に大きいではないかもしれません。)私は自分のクラスNotificationを宣言したので、私はこれを得ていたし、それは財団の通知クラスをいじった

+0

しかし、私は VaRのハッシュ値と何をすべきでしょうか? – Oleksandr

+1

はい、しかし、あなたは、このクラスのためにハッシュ/可用性をどのように働かせるかを決める必要があります。彼らは一緒に働く必要があります。あなたが何をしたいのかを言わなければ、ココアはあなたが望むものではないように見えるオブジェクトアイデンティティに落ちます。そして、あなたはココアが期待する方法でこれを行う必要があります。それは私の答えで「さらなる調整」が意味するものです。 - たとえばhttp://stackoverflow.com/a/33320737/341994を参照してください。 – matt

0

Person宣言の前にこれを置くように提案するだけです。

@objc(Person) 
class Person { 
... 
} 
+0

我々は@objc使用することができます...しかし:NSObjectのは、たくさん助け...) – Oleksandr

0

@objc func playerItemDidReachEnd(notification: Notification) {...} 

は、だから私は、人がNSObjectのから継承できFoundation.Notification

@objc func playerItemDidReachEnd(notification: Foundation.Notification) {...} 
関連する問題