2016-08-11 6 views
6

私はSwiftを初めて使い、Equatableに準拠したプライベート列挙型を作成しようとしていました。ここに私のコードの単純化した表現である:「==」メソッドの行でSwiftのプライベート列挙型の等価メソッドの作成方法

class Baz { 

    /* Other members in class Baz */ 

    private enum Test: Equatable { 
     case Foo 
     case Bar 
    } 

    private func == (lhs: Test, rhs: Test) -> Bool { 
     //comparison 
    } 
} 

、コンパイラは「演算子は、唯一のグローバルスコープで許可されている」不平を言っています。そして、enum Testと "=="メソッドをpublicに変更してクラスの "=="を移動すると、エラーは消えます。

私の質問は、「==」メソッドをプライベート列挙型に実装する正しい方法は何ですか?

何か助けていただければ幸いです。

========

編集:すべての私を助けるため

感謝。

private enum Test: Equatable { 
    case Foo 
    case Bar 
} 

private func ==(lhs: Test, rhs: Test) -> Bool { 
    return true 
} 

class A { 
    func aFunc() { 
     let test: Test = .Foo 
     let test2: Test = .Foo 

     if (test == test2) { 
      print("Hello world") 
     } 
    } 
} 

let a = A() 

a.aFunc() // Hello world 

あなたの質問を編集することができます。私は、私が遊び場にしようと、それは私の作品私のプライベート列挙型および機能は、上記のクラスで...(コードが更新される)されていることを

+2

私はあなたが持っていることを結論づけた2つの答えを見ています、そして、あなたはグローバルスコープでこれを実装しているとはっきりと仮定していますが、私はあなたのエラーメッセージから、タイプ(例えば、 'クラス ')。おそらくあなたは明らかにすることができます。 – Rob

答えて

2

が指定されていませんでしたあなたのコードで?だからあなたの問題に合わせて自分の答えを編集することができます。

+0

確かにこれは起こりたくありません:http://swiftlang.ng.bluemix.net/#/repl/57acfee6f01121f27706b037 – Alexander

1

あなたが何をしたかと間違って何もありません:おそらく、それはベータ5のように、スウィフト3に、あなたがこのAを作ることができることは注目に値するあなたのためにすぐに有用ではないですが

private enum Test: Equatable { 
    case Foo 
    case Bar 
} 

private func ==(lhs: Test, rhs: Test) -> Bool { 
    // Put logic here 
} 

private let test = Test.Foo 
private let test2 = Test.Foo 

if (test == test2) { 
    print("Hello world") 
} 

this article for details.

3

を参照してください。タイプ内のstatic func。 を参照してください。

演算子は、その型または拡張子内で定義できます。例えば:

struct Foo: Equatable { 
    let value: Int 
    static func ==(lhs: Foo, rhs: Foo) -> Bool { 
     return lhs.value == rhs.value 
    } 
} 

このような演算子はstatic(又は、クラス内、class final)として宣言され、そしてそれらのグローバル対応と同じシグネチャを持っている必要があります。

これはenumタイプでも機能します。したがって:

private enum Test: Equatable { 
    case foo 
    case bar 

    static func ==(lhs: Test, rhs: Test) -> Bool { 
     // your test here 
    } 
} 

これは、このTestが別のタイプで実装されている場合でも動作します。

関連する問題