2016-08-29 13 views
4

私は初心者です。 は、ここで私が知りたいのですが、コードSwift.Extensions varとfunc。どちらがいいですか?

extension Double { 
    func abs1() -> Double { 
     return (self > 0) ? self : -1.0 * self 
    } 

    var abs2 : Double { 
     return (self > 0) ? self : -1.0 * self 
    } 
} 

は、彼らが働くと、どちらが優れているかどのように、ABS1()関数とABS2変数の違い何ですか?

+0

これらは同じことをしており、同じではないにしても同じパフォーマンス特性を持っている必要があります。ほとんどの場合、数値の絶対値をその数値のプロパティとみなすかどうかが決まります。 – zneak

+0

より良いfuncを読むためには、より明確で論理的ですが、技術的には両方とも同じ場合は –

答えて

5

これらの機能は同じです。それは本当に意図の信号です。個人的には、私はこの場合に関数をお勧めしますが、これは少し直観的ではありませんので、説明します。

最初のルールは「副作用がありますか?」です。そうであれば、関数でなければなりません。

2番目のルールは「is it O(1)?」です。 (つまり、「一定の時間がかかり、一般に実行時間が短いと想定されている」という意味です。言い換えれば、「安いのですか?」)そうでなければ、関数でなければなりません。

しかし、3番目の微妙なルールは、「インスタンスの「プロパティ」とは合理的に考えられますか?この場合、私は議論したいと思います。インスタンスとはまったく異なるものです。それはインスタンスの計算されたであり、インスタンスの内部部分ではありません。これは、計算されていないプロパティ( "-4"の "abs"フィールドとして "4"を格納しないでください)で置き換えることはかなりばかげているでしょう。だから私はそれを機能にします。

スウィフト3では、absはそのタイプの静的関数です(たとえば、(4.0).absではなくDouble.abs(4.0))。それはあなたの質問を無効にするものではありませんが、の具体的な場合はというケースがあります。それがチームの対処方法です。

+0

+1です。私はいつもそれらをプロパティ*として使用していますが、それは意味があります*しかし、関数か計算されたプロパティかどうかを考慮する必要がある他の2つの基準が好きです。それは副作用がなく、それが "安い"ときにそれを財産とみなすことは理にかなっています。 –

+0

ちょうど注: 'Double'の静的' abs() 'メソッドは' AbsoluteValuable'プロトコルに準拠しています。これは、符号付き数値型がグローバルな 'abs()'メソッドにカスタマイズされた実装を提供するためのオプションです。関数。私はそれが本当に一般的なインスタンス上で動作するメソッドを実装するための実際の方法であるとは確信していません。あるいは、実際に直接呼び出されることを意味します。あなたの答え(とupvoted)のガイドラインが本当に好きでしたが、プロトコルに準拠する必要がない限り、この種の関数を静的メソッドとしてモデル化するのは間違っていると思います。 –

+0

これは直接このように呼び出されるべきではないが、absの場合、特に好ましい方法は空き関数 'abs()'です。フリー機能はSwiftでは非常に珍しいですし、あなたが正しいことは、一般にAPIのモデルとして使用するにはやや劣っていることです。 –

関連する問題