因为in let而不是var

时间:2016-01-29 15:22:25

标签: swift

我正在与Swift中的for-in-loop挣扎。我有两个for循环,我希望它们是等效的,但第一个给出错误,第二个按预期工作。有人可以解释一下为什么它的工作方式不同吗?

protocol Slide {
    var title: String { get set }
}

class BasicSlide: NSObject, Slide {
    var title: String = "Title"
}

var slides: [Slide]?
slides = [BasicSlide()]

for slide in slides! {
    slide.title = "New title" // Cannot assign to property: 'slide' is a 'let' constant
}

for var i in 0 ..< slides!.count {
    slides![i].title = "New title"
}

1 个答案:

答案 0 :(得分:3)

正如你正确地说,slide是这个表达式中的常量:

for slide in slides! {
    slide.title = "New title" // Cannot assign to property: 'slide' is a 'let' constant
}

如果您需要改变slide,请只需var引用它:

for slide in slides! {
    var slide = slide
    slide.title = "New title" // fine
}

(不要使用for var语法,因为很快就会废除该语言。)

但是,在您的示例中,有一个更好的方法:声明您的协议如下:

protocol Slide : class {
    var title: String { get set }
}

现在这段代码合法!

for slide in slides! {
    slide.title = "New title"
}

为什么呢?因为您现在保证Slide的采用者是一个类,并且一个类是一个引用类型,并且可以进行突变。之前失败的唯一原因是Swift害怕采用者可能是一个结构。