次のコードスニペットを見てみましょう:無限ループにおけるジェネリック医薬品の結果を使用してOptionalsためのオーバーライド/オペレータ
func/<T>(lhs: T?,rhs: T?) throws -> T? {
switch (lhs,rhs) {
case let (l?,r?):
return try l/r
default:
return nil
}
}
let x : Double? = 2
let y : Double? = 2
let z = try! x/y
私は2つのオプションのパラメータを期待する汎用関数を作成しました。このコードを実行すると無限ループにつながります。を試してみてくださいfunc/<T>(lhs: T?,rhs: T?)
を使用して値を分割してください。誰も2つのnoneオプションのdouble値を分割すると、私が書いたメソッドに関数呼び出しを行い、デフォルトではないと説明することができます/演算子の定義double?
私はすべてが魔法のように動作し、そのクラスの/静的オペレータを必要と拡張子によってダブルを拡張する場合:
protocol Dividable {
static func /(lhs: Self, rhs: Self) -> Self
}
extension Double: Dividable {}
func/<T:Dividable>(lhs: T?,rhs: T?) throws -> T? {
switch (lhs,rhs) {
case let (l?,r?):
return l/r
default:
return nil
}
}
let x : Double? = 2
let y : Double? = 2
let z = try! x/y
をご
switch
文を包みます'/'のビルトイン演算子は投げません。さらに、あなたの演算子が投げていないように見えるので、 'throws'とマークすることは実際に投げてしまわないので、実際には違いはありません。 – xoudini@xoudini私は上記のupvotedのコメントで推測された理由が真ではないことを指摘しているかもしれません: 'try'を使って非投げの関数をマークすることができます(警告します)コールのオーバーロード解決で'l/r'がOPが使用しようとしているオーバーロードを見つけられない理由は、以下のアンウォールでカバーされています。しかし、上記のコメントの2番目の部分は関連しています(なぜスロー?)。 – dfri
私はそれについて考えました。2つのダブルスを分割すると例外(0で割る)が発生する可能性があるので、** l/r **にtryをつける必要があります。その関数の呼び出し元は、失敗する可能性があることを知っています。 –