【问题标题】:can't set variable itself with getters and setters in swift [duplicate]不能在swift中使用getter和setter设置变量本身[重复]
【发布时间】:2018-03-10 13:16:51
【问题描述】:

我正在做一个关于 getter 和 setter 的示例,示例如下

import Foundation

class person
{
    var first_name:String
    {
        get
        {
           return self.first_name
        }
        set
        {
            if (newValue.rangeOfCharacter(from: CharacterSet.decimalDigits) != nil){
                print("please enter valid name")
            }
            else
            {
                self.first_name = newValue
            }
        }
    }
}

let person1 = person.init()
person1.first_name = "rahul"

但这给了我错误 但是当我做这个例子时

import Foundation

class person
{
    var name = ""
    var first_name:String
    {
        get
        {
            return name
        }
        set
        {
            if (newValue.rangeOfCharacter(from: CharacterSet.decimalDigits) != nil){
                print("please enter valid name")
            }
            else
            {
                name = newValue
            }
        }
    }
}

let person1 = person.init()
person1.first_name = "rahul"
print(person1.first_name)

它运行并给我输出所以我的问题是如果我使用 getter 和 setter 那么为什么我不能像我在上面的例子中那样获取或设置它自己的变量所以任何人都可以解释我发生了什么这里

【问题讨论】:

  • "但是这给了我错误但是当我做这个例子时"什么错误?
  • 在您的第一个示例中,您有一个 计算属性,其中包含一个 getter 和一个 setter,它们 递归地调用自己 ... ????跨度>
  • 你应该使用 struct 而不是 class 并且只创建一个容易出错的初始化器。 struct Person { let name: String ; init?(name: String) { guard name.rangeOfCharacter(from: .decimalDigits) == nil else { return nil } ; self.name = name } }
  • 所以在初始化你的 Person 对象时if let person = Person(name: "Rahul GUsai") { print(person.name) // "Rahul GUsai\n" } else { print("please enter valid name") }
  • 您还可以将一些计算属性添加到您的 Person 结构中,以添加功能,例如从人名extension Person { var personNameComponents: PersonNameComponents? { return PersonNameComponentsFormatter().personNameComponents(from: name) } var givenName: String? { return personNameComponents?.givenName } var familyName: String? { return personNameComponents?.familyName } } 中提取 familyName 或 givename

标签: swift properties getter-setter


【解决方案1】:

好的,假设我正在设置 first_name 属性。所以我称它为二传手。 setter 确保字符串有效,然后调用:

self.first_name = newValue

这会调用first_name 的设置器。字符串仍然有效,所以 setter 调用:

self.first_name = newValue

这会调用first_name 的设置器。字符串仍然有效,所以 setter 调用:

self.first_name = newValue

循环继续

现在您已经看到问题所在了。这将永远持续下去,直到程序由于递归过多而崩溃;你不能让 getter 和 setter 像这样称呼自己。相反,创建一个单独的 private var _first_name 属性,并让 first_name 的 getter 和 setter 访问它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    相关资源
    最近更新 更多