【问题标题】:Modify getter for Swift optional variable [closed]修改 Swift 可选变量的 getter [关闭]
【发布时间】:2018-02-28 12:12:31
【问题描述】:

我有可选的字符串。想要的是,当尝试访问它的变量时,如果它为 nil 或为空,则会引发错误。我想要类似的东西:

var myString: String? {
    get {
    guard !self.isEmpty || self == nil else { // throw error }
    return self
    }
}

是否可以在 Swift 中编写这样的代码?谢谢。

【问题讨论】:

  • 只是一个旁注 - self 永远不能为零
  • @MilanNosáľ 它是可选的。怎么可能不为零?虽然我不知道语法
  • 如果 self 为 nil,您将无法访问 myString (即永远不会执行该块)
  • @EvgeniyKleban 您最好解释一下您想要实现的目标,因为您提供的(不可编译的)代码并不能帮助我们理解问题
  • @EvgeniyKleban,你认为self 在你的 sn-p 中代表什么?在您的视图中,您的 sn-p 中的 可选 是什么?

标签: swift


【解决方案1】:

首先注意myString 不能是nil,因为它不是可选的。如果您想允许存储nil,请将其声明为可选:

var myString: String?

检查self == nil 是多余的,因为如果selfnil,则永远无法访问此属性,并且您不能从计算属性中抛出异常,因此抛出也不起作用。

您可以将其声明为 private 并提供一个 getter 方法,该方法可以检查其 nil 是否为空并相应地抛出 }

如果您不希望 myString 成为 nil,则不要将其声明为可选。如果您不希望字符串为空,则在设置字符串时避免这样做。

private(set) myString: String // You cannot set the string directly outside of the class but you can access it freely

func setMyString(withValue value: String)
{
    if (value.isEmpty)
    {
        throw ... // 
    }

    myString = value
}

关于抛出错误检查这个link

【讨论】:

  • 好的,怎么做 - 你可以将它声明为私有并提供一个 getter 方法来检查它是 nil 还是空并相应地抛出 } ?能否提供编译代码sn-p?
  • 是否有必要将其设为私有(设置)?
  • 没有必要,但是可以从类外部操作字符串,然后可以将任何值(包括空字符串)存储在其中
【解决方案2】:

在 Swift 中,计算属性不能引发异常 - 如果您想确定,请查看 Swift 4.1 语言参考的 Throwing Functions and Methods 部分。因此,即使您的其余代码有意义,您也不能从计算属性中抛出异常。

无论如何,测试 self == nil 毫无意义 - self 不可能真的为零。如果一个对象为 nil,则它不存在,因此您无法访问它的任何属性/方法(它不存在,您将访问什么?)。

例如,如果您尝试调用yourObject?.myString,则myString 的getter 将根本不会被执行,因为yourObject 为nil,它不存在。如果您尝试使用! 强制它,它会立即崩溃。

【讨论】:

    猜你喜欢
    • 2018-04-26
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多