web-dev-qa-db-ja.com

Swift

そのようなセッターを作成すると:

   var masterFrame:CGRect{
        set{
            _imageView.frame = newValue
            _scrollView.frame = newValue
        }
    }

それは私がゲッターを作ることを余儀なくされています、それは私がしたくないです。

Swiftでゲッターなしでセッターを作成する方法はありますか?

32
Aggressor

セットオンリーのプロパティは、それが非常に理にかなっているようには聞こえません。代わりに、おそらくそのためのメソッドを使用する必要があります。

または、コンパイラーを幸せにし、決して呼び出さないゲッターを追加します。

get {
    return _imageView.frame
}
6
Dave Wood

docs から:

ゲッターは値を読み取るために使用され、セッターは値を書き込むために使用されます。 setter句はオプションであり、getterのみが必要な場合は、両方の句を省略して、要求された値を直接返すことができます(読み取り専用計算プロパティを参照)。 しかし、setter句を指定する場合は、getter句も指定する必要があります。

13
David

まあ、私が本当にしなければならないなら、私はこれを使うでしょう。

Swiftコンパイラはゲッターの一部の属性をサポートしているため、@available(*, unavailable)を使用できます。

public subscript(index: Int) -> T {
    @available(*, unavailable)
    get {
        fatalError("You cannot read from this object.")
    }
    set(v) {
    }
}

これにより、コードユーザーに意図が明確に伝わります。

12
Eonil

代わりにdidSetを使用してください:

var masterFrame:CGRect {
        didSet {
            _imageView.frame = masterFrame
            _scrollView.frame = masterFrame
        }
    }
8
Matjan

「セッターのみのプロパティ」を設定するには、値を設定する単純な関数を使用できます。たとえば、valueというプライベートプロパティがある場合、プロパティを更新するがプロパティへの外部アクセスを許可しないconfigureWithValue(value:String)というセッターメソッドを使用できます。

private var value:String

func configureWithValue(value:String) {
  self.value = value
}
8
Zorayr

承知しました。 nilを返し、型をオプションにすることができます:

var color: MyColorEnum? {
    get { return nil }
    set {
      switch newValue! {
      case .Blue:
        view.backgroundColor = UIColor.blueColor()
      case .Red:
        view.backgroundColor = UIColor.redColor()
      }
    }
  }

または、didSetを使用して、問題をすべて回避できます。

var color: MyColorEnum! {
  didSet {
    switch color {
      case .Blue:
        view.backgroundColor = UIColor.blueColor()
      case .Red:
        view.backgroundColor = UIColor.redColor()
      }
  }
}
6
seo

nilからgetを返すことができます:

var input: CGRect? {
    set(value) {
        guard let value = value else { return }
        // process the value here
    }
    get {
        return nil
    }
}
2

propertyの場合、setにアクセス修飾子を与えることができ、didSetでは_imageView.frame_scrollView.frame

private(set) var masterFrame:CGRect {
            didSet{
                _imageView.frame = masterFrame
                _scrollView.frame = masterFrame
            }
        }
0
Same7Farouk

例外を見つけました。セッターのみの変数が本当に好きです。これは、メソッドのクロージャーを、後で実行するために保存することだけを目的としたメソッドの唯一のパラメーターとして渡す場合です。

次のようにメソッドとして実装します。

typealias ThemeSetter = () -> ()

class Theme {

    fileprivate var themeSetters:[ThemeSetter] = []

    class var shared: Theme {
        struct Singleton {
            static let instance = Theme()
        }
        return Singleton.instance
    }
        ...

    func setColor(_ entry:@escaping ThemeSetter) {
        entry()
        themeSetters.append(entry)
    }
}

その後、次のようにメソッドを呼び出すことができます。

    Theme.shared.setColor({
        self.navigationBar.barTintColor = Theme.shared.gameBarTint
    })

しかし、閉じ括弧の後には多くの行があるかもしれないので、閉じ括弧の後の閉じパレスは好きではありません。

したがって、末尾クロージャーについて知っているので、コードを次のように変更できます。

    Theme.shared.setColor() {
        self.navigationBar.barTintColor = Theme.shared.gameBarTint
    }

これは完全に問題なく、Appleが末尾のクロージャに表示する構文です。パラメータが1つしかなく、ミニマリストであるため、コードをさらにスリム化して削減したいと思っています。これに:

    Theme.shared.setColor {
        self.navigationBar.barTintColor = Theme.shared.gameBarTint
    }

これもAppleがトレーリングクロージャの実行方法を示す方法です。ただし、この方法は通常、ある種の述語に使用されます。ここで、クロージャを使用してメソッドにソート方法やクロージャを実行する方法を指示します。非同期関数呼び出しの最後に完了クロージャとして使用されます。必要なのは、クロージャを...何かに割り当てます。

SetColorのメソッドを変数に置き換えると、次のようになります。

    var setColor:ThemeSetter? {
        didSet {
            if setColor != nil {
                setColor?()
                themeSetters.append(setColor!)
                setColor = nil
            }
        }
    }

呼び出しは次のようになります。

    Theme.shared.setColor = {
        self.navigationBar.barTintColor = Theme.shared.gameBarTint
    }

その等号は、すべての違いがあることを意味します。それは私がクロージャーを割り当てており、クロージャーを使用するいくつかの関数を実行していないことを示しています。 : ')<-ここに絵文字が必要です。

最終メモ:これは実際にはクロージャとは関係ありませんが、nilを返すことを除いて、セッターのみの変数を作成する方法を示しています。これは、真のセッターのみが行うように、ユーザーが読み取りのために変数にアクセスすることからクラスを保護するためのものではありません。また、トレーリングクロージャーとシングルトンに関するチュートリアルは許してください。

正解になるのに十分な賛成票を獲得できない場合がありますが、なぜ「正解できません。メソッド呼び出しを使用する必要があります!」という正解です。私は、その構文をすべて必要とする「Ni」と言います。変数を使用し、それを読み戻さないでください。読み戻しても、何も返さないでください。ルドルフ・アダムコビッチの回答のようなもので、それは0票を得ました。

0
Sojourner9