仅在Swift中创建一个Setter

时间:2014-10-08 01:01:36

标签: ios swift getter getter-setter

当我创建这样的setter时:

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

这迫使我做一个我不想做的吸气剂。

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

9 个答案:

答案 0 :(得分:13)

来自docs

  

getter用于读取值,setter用于写入   价值。 setter子句是可选的,当只有getter时   需要,你可以省略这两个条款,只需返回请求   直接值,如只读计算属性中所述。的但   如果你提供了一个setter子句,你还必须提供一个getter   子句。

答案 1 :(得分:10)

如果我真的需要,我会用它。

Swift编译器支持getter上的一些属性,因此您可以使用@available(*, unavailable)

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

这显然会将您的意图传达给代码用户。

答案 2 :(得分:8)

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

private var value:String

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

答案 3 :(得分:7)

改为使用didSet:

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

答案 4 :(得分:5)

仅设置属性听起来没有多大意义。你可能应该使用一种方法代替。

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

get {
    return _imageView.frame
}

答案 5 :(得分:5)

不确定。您可以返回一个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 :(得分:1)

您可以从#!bin/python返回nil

get

答案 7 :(得分:0)

我找到了一个例外,我真的很喜欢一个只有setter的变量,当我将一个闭包作为方法中唯一的参数传递时,只是为了保存它以供以后执行。

我将其实现为如下方法:

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
    })

但是我不喜欢在近距离之后关闭paretheses,因为我可能在关闭时有很多行。

因此,了解Trailing Closures我可以将代码更改为:

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

这完全没问题,是Apple为Trailing Closures显示的语法。由于我只有一个参数并且是极简主义者,我很想让代码更加精简并将其减少到这个:

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

Apple再次展示如何进行尾随关闭;除此之外,这种方式通常用于某种谓词,其中闭包用于告诉方法如何进行排序,或者在异步函数调用结束时将闭包用作完成闭包。我想要的是将闭包分配给...... Something。

如果我用变量替换setColor的方法,它看起来像这样:

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

现在呼叫如下:

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

等号表示所有差异。它表明我正在分配一个闭包而不是运行一些使用闭包的函数,即使它确实如此。 :')< - 需要表情符号。

最后的注意事项:这实际上与闭包无关,它只是展示了如何只设置一个setter变量,除了它仍然返回nil。它并不意味着保护类不会让用户访问变量以进行读取,就像真正的setter一样。另外,请原谅Trailing Closures和Singletons教程。

我可能没有得到足够的Up Votes是正确的答案,但为什么是正确答案,"不,你不能!您必须使用方法调用!"。我说," Ni"对此,谁需要所有语法。只是使用一个变量而不读它,或者如果你这样做,不要让它返回任何东西。有点像Rudolf Adamkovic的回答,得到0 Up Votes。

答案 8 :(得分:0)

您可以将访问权限修饰符赋予set以获得属性,并可以在didSet上将其分配给_imageView.frame_scrollView.frame

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