2016-10-15 4 views
1

以下の例では、+演算子を自由に使用してRequestインスタンスの配列を作成できるようにしようとしています。Array型を使用したSwift 3 `+`演算子のバグ

struct Request {} 

typealias BatchRequest = Array<Request> 

func +(lhs: Request, rhs: Request) -> BatchRequest { 
    return [lhs, rhs] 
} 

func +(lhs: Request, rhs: BatchRequest) -> BatchRequest { 
    var arr: [Request] = [lhs] 
    arr.append(contentsOf: rhs) 
    return arr 
} 

func +(lhs: BatchRequest, rhs: Request) -> BatchRequest { 
    var arr: [Request] = lhs 
    arr.append(rhs) 
    return arr 
} 

func +(lhs: BatchRequest, rhs: BatchRequest) -> BatchRequest { 
    var lhs: [Request] = lhs 
    lhs.append(contentsOf: rhs) 
    return lhs 
} 

let req1 = Request() 
let req2 = Request() 
let req3 = Request() 

print(req1 + req2) 
// Prints "[Request(), Request()]" 

print(req1 + req2 + req3) 
// Error: argument type 'BatchRequest' (aka 'Array<Request>') does not conform to expected type 'Any' 

2つのオペランドで使用するとうまくいきますが、3つ以上で使用すると機能しません。

演算子を&に変更するか、左結合演算子を使用したカスタム演算子を使用するとうまくいきます。したがって、オーバーロードがエラーをスローするようなAdditionPrecedenceグループについては何かが推測できます。

私は&のために解決できましたが、特定のタイプの場合にのみ+の動作を無効にする何らかの方法があるかどうかを知りたいと思います。または実際に既存の演算子を再宣言します。

(私もあまり希望を持っていません。文書には何も私ができることを示唆している。)

+0

それは確かスウィフトコンパイラが困難3の種類を推測するために '' +演算子(または具体的には、 'AdditionPrecendence' PREC。グループ)の_left_結合性を利用することを持っているかのように思えるん-operandsの例です。この仮説を検証する方法として、 'rhs'と' lhs'とは何かを明示的に区別することができることに気づくでしょう。 'print((+)(req1 + req2、req3))'これはバグを暗示する可能性があります。特に、カスタム演算子を使用するときに同じ問題に遭遇しないためです。また、 'BatchArray'がタプルなので、' arr.append'とは関係がないので、同じ問題が発生します。 – dfri

+0

@dfriバグだと思う。 Swift 2.2では、同じコードが正常に動作します。 – BridgeTheGap

+2

確かに。私は[次の既存のバグレポート(SR-1668)](https://bugs.swift.org/browse/SR-1668)が同じ問題を扱っていると信じています。既存の演算子のカスタムオーバーロード)。 – dfri

答えて

0

は、Xcodeの7.3.1(スウィフト2.2)でそれを試みたが、上記のコードはうまく働きました。

私はSwift 2.2でこのコードを書いて、コードが正常に機能していることを確認したが、わからなかった。

私はSwiftにバグレポートを提出します。

Xcode 7.3.1

関連する問題