2016-05-07 9 views
3
public func +<T: CustomStringConvertible>(lhs: T, rhs: T)->String{ 
    return lhs.description+rhs.description 
} 

let a:String = "A" 

let i:Int = 0 

print(a+i) 

CustomStringConvertible型の '+'演算子がオーバーロードされています。 StringとIntはどちらもCustomStringConvertibleプロトコルを確認しますが、 "2進演算子 '+'は 'String'型と 'Int' print(a + i)のオペランドには適用できません。 'String' + 'NSNumber'に適用するとうまく動作します。 シーンの背景に何が起こっているのか分かりません。なぜそれは働いていないのですか?CustomStringConvertibleプロトコルがIntで機能しないのはなぜですか?

答えて

3

まず、問題はStringCustomStringConvertibleに準拠していません。したがって、descriptionの場合はselfを返すように、それを自分自身に適合させたいと思うでしょう(おそらく別のオーバーロードを書いて文字列を扱う方が簡単かもしれません)。

extension String:CustomStringConvertible { 
    public var description: String { 
     return self 
    } 
} 

第二に、あなたは両方のパラメータがCustomStringConvertibleに適合していることを保証しながら、それは両方のパラメータのためのさまざまなタイプを受け入れることを可能にするために、あなたの+過負荷のための一般的なパラメータを必要とする:

public func +<T: CustomStringConvertible, U:CustomStringConvertible>(lhs: T, rhs: U)->String{ 
    return lhs.description+rhs.description 
} 
+0

感謝を@ originaluser2 – tailor

+0

@Tailorハッピーに役立つ:) – Hamish

関連する問題