Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 仅在Swift中创建Setter_Ios_Swift_Getter_Getter Setter - Fatal编程技术网

Ios 仅在Swift中创建Setter

Ios 仅在Swift中创建Setter,ios,swift,getter,getter-setter,Ios,Swift,Getter,Getter Setter,创建setter时,例如: var masterFrame: CGRect { set { _imageView.frame = newValue _scrollView.frame = newValue } } 这迫使我去做一件我不想做的事情 有没有办法在Swift中创建一个没有getter的setter?来自: getter用于读取值,setter用于写入 价值。setter子句是可选的,并且当只需要一个getter时 如果需要,您可以省略这

创建setter时,例如:

var masterFrame: CGRect {
    set {
        _imageView.frame = newValue
        _scrollView.frame = newValue
    }
}
这迫使我去做一件我不想做的事情

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

来自:

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


仅限集合的属性听起来没有多大意义。您可能应该使用一种方法来代替

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

get {
    return _imageView.frame
}
要有一个“仅setter属性”,您只需要有一个设置值的简单函数;例如,如果我们有一个名为
value
的私有属性,我们可以有一个名为
configureWithValue(value:String)
的setter方法,该方法更新属性,但不允许外部访问该属性:

private var value:String

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

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

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


这将清楚地向代码用户传达您的意图。

当然。您只需返回一个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()
      }
  }
}

我发现了一个例外,我真的很喜欢setter-only变量,当我传递闭包作为方法中唯一的参数时,唯一的目的是保存它以供以后执行

我将其作为一种方法实现,如下所示:

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
    })
然后,我可以按如下方式调用该方法:

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
    }
    var setColor:ThemeSetter? {
        didSet {
            if setColor != nil {
                setColor?()
                themeSetters.append(setColor!)
                setColor = nil
            }
        }
    }
    Theme.shared.setColor = {
        self.navigationBar.barTintColor = Theme.shared.gameBarTint
    }
这很好,这是Apple为尾部闭包显示的语法。因为只有一个参数,而且我是一个极简主义者,所以我想让代码更加精简,并将其简化为:

    Theme.shared.setColor {
        self.navigationBar.barTintColor = Theme.shared.gameBarTint
    }
这也是苹果在做后续关闭时的表现;除此之外,这种方法通常用于某种谓词,其中闭包用于告诉方法如何进行排序,或者何时在异步函数调用结束时将闭包用作完成闭包。我想要的是将闭包分配给。。。什么

如果我用一个变量替换setColor的方法,它如下所示:

    Theme.shared.setColor() {
        self.navigationBar.barTintColor = Theme.shared.gameBarTint
    }
    var setColor:ThemeSetter? {
        didSet {
            if setColor != nil {
                setColor?()
                themeSetters.append(setColor!)
                setColor = nil
            }
        }
    }
    Theme.shared.setColor = {
        self.navigationBar.barTintColor = Theme.shared.gameBarTint
    }
现在,调用如下所示:

    Theme.shared.setColor() {
        self.navigationBar.barTintColor = Theme.shared.gameBarTint
    }
    var setColor:ThemeSetter? {
        didSet {
            if setColor != nil {
                setColor?()
                themeSetters.append(setColor!)
                setColor = nil
            }
        }
    }
    Theme.shared.setColor = {
        self.navigationBar.barTintColor = Theme.shared.gameBarTint
    }

等号意味着所有的差异。这表明我正在分配一个闭包,而没有运行使用该闭包的函数,即使它使用了。:') 改用
didSet

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

您可以为属性
设置
的访问修饰符,并在
didSet
上将其分配给
\u imageView.frame
\u scrollView.frame

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

不-听起来你最好使用一个方法。你什么时候使用只写属性?我从来没有这样做的机会。我有一个类,你可以设置它的主框架,但它负责管理会影响它自己的事情(因为它是复合的,所以永远不要更改主框架),用户除了设置它之外,不应该使用主框架。
setMasterFrame(frame:CGRect)有什么问题吗
?这并不是说有什么问题,但我更喜欢一个二传手,但很明显,这将是我必须要走的路线。必须有一个方法来解决这个问题。在很多情况下,我需要的是没有getter的setter…@Aggressor解决方法是在Eonil-answer中,使用
@available(*,unailable)
。这是我当前的解决方案,但我希望我没有:(您还可以在imageView的框架上放置一个
didSet
闭包,用于更新scrollView的框架。或者使用带有约束的自动布局使它们相等。setter用于设置。属性观察器用于在访问属性之前/之后执行任务。您必须使用
didSet
来完成您试图完成的任务“仅限集合的属性听起来没有多大意义。”示例:在没有反馈硬件的机器人上设置电机的输出。你可以记住上一次设置的速度,并希望硬件能遵守它,但这并不意味着这一解决方案的问题在于没有任何东西可以阻止某人将
设置为零,从而使你的应用程序崩溃(或者强迫你为这种情况添加额外的处理)。这可能会起作用,但也可能会在API设计方面产生混淆/不一致。它让masterFrame公开阅读,这似乎不是目标。应该接受作为答案。