Swift 因为in给出了let而不是var

Swift 因为in给出了let而不是var,swift,Swift,我在Swift中遇到了一个for-in循环。我有两个for循环,我希望它们是等价的,但是第一个给出了一个错误,第二个正如我所期望的那样工作。有人能解释一下为什么它的工作方式不同吗 protocol Slide { var title: String { get set } } class BasicSlide: NSObject, Slide { var title: String = "Title" } var slides: [Slide]? slides = [Basi

我在Swift中遇到了一个for-in循环。我有两个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"
}
协议幻灯片{
变量标题:字符串{get set}
}
类BasicSlide:NSObject,幻灯片{
var title:String=“title”
}
变量幻灯片:[幻灯片]?
幻灯片=[BasicSlide()]
用于幻灯片中的幻灯片!{
slide.title=“New title”//无法分配给属性:“slide”是一个“let”常量
}
对于0中的变量i..<幻灯片!。计数{
幻灯片![i].title=“新建标题”
}

正如您所说,
幻灯片在这个表达式中是一个常量:

for slide in slides! {
    slide.title = "New title" // Cannot assign to property: 'slide' is a 'let' constant
}
如果您需要修改
幻灯片
,只需引用
var
即可:

for slide in slides! {
    var slide = slide
    slide.title = "New title" // fine
}
(不要将
用于var
语法,因为它很快就会从该语言中废除。)

但是,在您的示例中,有一种更好的方法:像这样声明您的协议:

protocol Slide : class {
    var title: String { get set }
}
现在这个代码是合法的

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

为什么??因为您现在已经保证了幻灯片的采用者是一个类,而类是一个引用类型,并且可以在适当的位置进行修改。以前失败的唯一原因是Swift担心采用者可能是一个结构。

使协议符合
class
将解决
中的
问题:
协议幻灯片:class{}
。好吧,这是因为幻灯片也可能是实现幻灯片协议的枚举,在这种情况下,这是行不通的?@Eendje问题中有几种解决方案,但你的解决方案很有趣,你知道为什么会发生这种情况吗?我猜,使协议类仅具有默认情况下
var
中的
中的属性只是一种猜测,在文档中,协议中
类的使用非常差。