6135


以下のように新たな演算子を定義し、そして処理を書きました。  
これをMaybe.swiftとしてxcodeプロジェクトに追加します。

[code]

    infix operator >>= { associativity left }
    
    public func >>=<T, U>(optional: T?, f: T -> U?) -> U? {
        if let x = optional {
            return f(x)
        } else {
            return nil
        }
    }
    
[/code]

この状態で、Maybe.swift以外のSwiftコード、例えばViewController.swiftで、

[code]

    let input: String? = "10"
    let output = input >>= { value -> Int? in
        Int((value as NSString).intValue)
    } >>= { value -> Int? in
        if value >= 0 {
            return value
        }
        return nil
    }
    
[/code]

のように使おうと試みますが、これだけではコンパイルに失敗します。

エラー> [...省略]/ViewController.swift:17:28: Cannot invoke '>>=' with an argument
list of type '(String?, $T9)'

トライ＆エラーにより、わかった原因は、演算子の定義が見えていないことです。

なので、この場合、ViewController.swiftのグローバルスコープに、

[code]

    infix operator >>= { associativity left }
    
[/code]

を足してやることによって、コンパイルに成功し、動作も正常になりました。  
しかしこの解決方法では、  
この演算子を使いたいファイルには全て

[code]

    infix operator >>= { associativity left }
    
[/code]

を毎回コピペしなくてはなりません。  
これをコピペしなくて済む方法はありませんでしょうか？


CC BY-SA 3.0
2015-02-07T08:31:00.113
6093
2015-02-08T06:14:32.797
7368
question
ios swift
infix operatorが他のファイルから参照できない


次のように括弧を足すとエラーが解消されました。

[code]

        let input: String? = "10"
        let output = (input >>= { value -> Int? in
            Int((value as NSString).intValue)
            }) >>= { value -> Int? in
                if value >= 0 {
                    return value
                }
                return nil
        }
    
[/code]

必ずしもファイルごとに演算子定義を書かないと使えないというわけではないようです。

(input >>= {}) >>= {}

このように括弧を足すとコンパイルが通りますが、associativity left
で定義してるので本来は括弧を書かなくても左から処理されるべきだと思います。  
findall さんがおっしゃるように >>== に変更するとコンパイルエラーが解消するので、既存の演算子とぶつかって悪さしてるんじゃないかと思います。

ここらへんはよく分かりませんがXCodeのバグかもしれません。

findall さんと同じ結論ですが、とりあえず >>= は既存の演算子と被るので避けた方が無難かなと思います。


CC BY-SA 3.0
2015-02-08T06:14:32.797
6135
2015-02-08T06:14:32.797
8148
6093
answer