2016-03-22 9 views
5

こののみセッタープライベートプライベートセッター「セット()」スイフト

docs
struct Point { 
    var x = 0.0, y = 0.0 
} 
struct Size { 
    var width = 0.0, height = 0.0 
} 
struct Rect { 
    var origin = Point() 
    var size = Size() 
    var center: Point { 
     get { 
      let centerX = origin.x + (size.width/2) 
      let centerY = origin.y + (size.height/2) 
      return Point(x: centerX, y: centerY) 
     } 
     set(newCenter) { 
      origin.x = newCenter.x - (size.width/2) 
      origin.y = newCenter.y - (size.height/2) 
     } 
    } 
} 
+2

センターを取得できますが、直接設定できないようにしたいですか?それですか? –

+0

はい、あなたは正しいです –

+1

私はそれがあなたが望むものに合うかもしれないと思って私の答えを元に戻しました。 'private(set) 'を使うもう一つの答えはうまくいくかもしれませんが、それがそうでないと思うものとは異なって動作します。 centerプロパティを設定できないようにするためには、中心の計算プロパティを使用するのが最善の方法です。これがうまくいくと期待しています –

答えて

1

struct Rectを次のように改良することができます。これにより、あなたは中心を得ることができますが、それを設定することはできません。

struct Rect { 

    var center:Point { 
     let centerX = origin.x + (size.width/2) 
     let centerY = origin.y + (size.height/2) 
     return Point(x: centerX, y: centerY) 
    } 

    var origin = Point() 
    var size = Size() 
} 
12

、見出しの下の最初のコードサンプルでは「どのようにすることができappleによって提供された例導入パイント構造セッターゲッターを指しています

private (set) var center: Point {... 

いくつかの明確化: - それは正しいへのアクセスを制限スウィフトで private少し異なる働きGetterおよびSetter」あなたはプライベートセッターを持っていることを確認することができ、構文は次のようになりますty /メソッドをファイルのスコープに追加します。ファイルに複数のクラスが存在する限り、すべてのコンテンツにアクセスできます。 privateが「働く」ためには、あなたのクラスを別々のファイルにする必要があります。

+0

これは実際のプロジェクトではなく、プレイグラウンドでも警告を生成しません。私は 'Point'を' center'プロパティに設定することができます。 –

+5

'Private'はSwiftで少し違って動作します - プロパティ/メソッドの使い方を* file *の範囲に制限します。だから遊び場では、私は真の私有財産を達成することができません(少なくとも私は方法を知らない)。実際のプロジェクトでは、クラスを別々のファイルに保存する必要があります.1つのファイルに2つのクラスがあれば、すべてのプロパティ/メソッドにアクセスできます。 – Losiowaty

+1

ありがとう、それはまさに私が考えていたものです。 –

関連する問題