在Swift中创建一个Setter

Agg*_*sor 31 getter getter-setter ios swift

当我创建这样的setter时:

   var masterFrame:CGRect{
        set{
            _imageView.frame = newValue
            _scrollView.frame = newValue
        }
    }
Run Code Online (Sandbox Code Playgroud)

它迫使我做一个我不想做的吸气剂.

有没有办法在没有getter的情况下在Swift中创建一个setter?

Eon*_*nil 15

好吧,如果我真的需要,我会用这个.

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

这在运行时进行检查,但显然会将您的意图传达给代码用户.

如果Swift编译器支持getter上的某些属性,那将是很好的.

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

但目前这不起作用:P(Swift 1.2,版本6.3.1(6D1002))

最快,最简单的方法就是在Apple Radar和Apple Developer Forum上提出这个问题.


Dav*_*vid 13

来自文档:

getter用于读取值,setter用于写入值.setter子句是可选的,当只需要一个getter时,你可以省略这两个子句,直接返回所请求的值,如Read-Only Computed Properties中所述.但是,如果提供setter子句,则还必须提供getter子句.

  • 有办法解决这个问题.有很多情况我想要没有吸气剂的安装者...... (29认同)
  • @Aggressor 的方法是在 Eonil 答案中,使用 `@available(*,available)`。 (2认同)

Mat*_*jan 9

请改用didSet:

var masterFrame:CGRect {
        didSet {
            _imageView.frame = masterFrame
            _scrollView.frame = masterFrame
        }
    }
Run Code Online (Sandbox Code Playgroud)


Zor*_*ayr 8

要拥有"仅限setter属性",您可以只使用一个设置值的简单函数; 例如,如果我们有一个名为的私有属性value,我们可以调用一个setter方法configureWithValue(value:String)来更新属性但不允许外部访问该属性:

private var value:String

func configureWithValue(value:String) {
  self.value = value
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*ood 6

仅设置属性听起来不是很有意义.您可能应该使用一种方法.

或者,只需让编译器开心并添加一个你从不调用的getter:

get {
    return _imageView.frame
}
Run Code Online (Sandbox Code Playgroud)

  • 你还可以在imageView的框架上放置一个```didSet```闭包来更新scrollView的框架.或者使用带有约束的AutoLayout使它们相等. (4认同)
  • "只设置一个属性听起来不是很有意义." 示例:在机器人上设置电机的输出,但没有反馈硬件.你可以记住最后设定的速度,并希望硬件能够兑现它,但这并不意味着什么 (3认同)

seo*_*seo 6

当然.你可以返回一个nil并使类型可选:

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

或者,您可以使用didSet以避免所有问题:

var color: MyColorEnum! {
  didSet {
    switch color {
      case .Blue:
        view.backgroundColor = UIColor.blueColor()
      case .Red:
        view.backgroundColor = UIColor.redColor()
      }
  }
}
Run Code Online (Sandbox Code Playgroud)