当我创建这样的setter时:
var masterFrame:CGRect{
set{
_imageView.frame = newValue
_scrollView.frame = newValue
}
}
这迫使我做一个我不想做的吸气剂。
有没有办法在没有getter的情况下在Swift中创建一个setter?
答案 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
}
}