当前位置: 首页 > 面试题库 >

更改在变量的willSet块中设置的值

梁丘翔
2023-03-14
问题内容

我正在尝试在设置数组之前对要设置的数组进行排序,但是的参数willSet是不可变的,并且会sort改变值。如何克服这个限制?

var files:[File]! = [File]() {
    willSet(newFiles) {
        newFiles.sort { (a:File, b:File) -> Bool in
            return a.created_at > b.created_at
        }
    }
}

为了使这个问题脱离我自己的项目环境,我提出了以下要点:

class Person {
    var name:String!
    var age:Int!

    init(name:String, age:Int) {
        self.name = name
        self.age = age
    }
}

let scott = Person(name: "Scott", age: 28)
let will = Person(name: "Will", age: 27)
let john = Person(name: "John", age: 32)
let noah = Person(name: "Noah", age: 15)

var sample = [scott,will,john,noah]



var people:[Person] = [Person]() {
    willSet(newPeople) {
        newPeople.sort({ (a:Person, b:Person) -> Bool in
            return a.age > b.age
        })

    }
}

people = sample

people[0]

我收到错误消息,指出该newPeople变量不可变,sort正在尝试对其进行突变。


问题答案:

不能对内部的值进行突变willSet。如果实现willSet观察者,则将新的属性值作为常量参数传递给它。

修改它以使用该didSet怎么办?

var people:[Person] = [Person]()
{
    didSet
    {
        people.sort({ (a:Person, b:Person) -> Bool in
            return a.age > b.age
        })
    }
}

willSet在值存储之前被调用。
didSet新值存储后立即调用。

您可以在此处阅读有关财产观察员的更多信息
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html

您还可以像下面这样编写自定义getter和setter。但是didSet似乎更方便。

var _people = [Person]()

var people: [Person] {
    get {
        return _people
    }
    set(newPeople) {
        _people = newPeople.sorted({ (a:Person, b:Person) -> Bool in
            return a.age > b.age
        })
    }

}


 类似资料:
  • 问题内容: 是否有可能在 ES6 设置的变量中使用严格模式? 由于定义超出范围,因此无法删除。看来可行的唯一方法是: 基本上,有什么方法可以代替这种情况吗? 问题答案: 将变量声明为要求您立即将其指向一个值,并且此引用不能更改。 表示您无法在某个位置(之外)进行定义,而在其他位置(内)为其赋值。 另一方面,在块内创建它并为其赋值都很好。 但是,它是块范围的,就像一样,因此,如果您确实在块中创建它并

  • 问题内容: 我了解的这段代码。我们复制A并将其称为C。当A更改时,C保持不变 但是当A是一个数组时,我们会有不同的情景。C不仅会改变,而且甚至在我们碰到A之前都会改变 有人可以解释第二个示例中发生的情况吗? 问题答案: Pointy的答案有很好的信息,但这不是此问题的正确答案。 OP所描述的行为是一个错误的一部分,该错误于2010年3月首次报告,并于2012年8月为Webkit进行了修补,但截至本

  • 问题内容: 我不熟悉Thymeleaf,并将Web页面从JSP转换为Thymeleaf。我有一个像这样的strut标签: 该变量可以在JSP中的任何地方使用。Thymeleaf中是否有其他替代方法? 问题答案: 你可以使用局部变量。 声明带有属性的HTML元素。例如 文档说明 当被处理时,该变量被创建为一个局部变量,并添加到变量地图从上下文来,所以它是可用于评估任何其他变量从一开始就在上下文中声明

  • 问题内容: 我有一个简单的Java类,如下所示: 这段代码的输出是这样的: 为什么s不在finally块中覆盖,而是控制打印输出? 问题答案: 在与所述的执行块完成语句和的值在时间语句执行是由该方法返回的值。finally子句稍后s(在语句完成之后)更改值的事实(此时)并未更改返回值。 请注意,以上内容处理的s是对块中自身值的更改,而不是对s引用对象的更改。如果s是对可变对象的引用(String不

  • #include <stdio.h> int func(void) { int i = 2; return i; } int main(void) { int a = 0; a = func(); printf("%d\n", a); return 0; } 技巧 在gdb中,可以用“set var variable=expr”命令设置变量

  • 问题内容: 这个问题不太可能对将来的访客有所帮助;它仅与较小的地理区域,特定的时间段或极为狭窄的情况(通常不适用于Internet的全球受众)有关。要获得使该问题更广泛适用的帮助,请访问帮助中心。 7年前关闭。 我得到一个页面网址,例如。现在,有人告诉我将b的值更改为5,以使其变为。 即从更改为 注意:此处的变量b可以引用任何名称。 问题答案: 采用 从URL中提取查询字符串 将查询字符串拆分为一