我正在为 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"
}
Run Code Online (Sandbox Code Playgroud)
正如你所说,slide是这个表达式中的一个常量:
for slide in slides! {
slide.title = "New title" // Cannot assign to property: 'slide' is a 'let' constant
}
Run Code Online (Sandbox Code Playgroud)
如果您需要改变您的slide,只需var引用它:
for slide in slides! {
var slide = slide
slide.title = "New title" // fine
}
Run Code Online (Sandbox Code Playgroud)
(不要使用for var语法,因为它很快就会从语言中废除。)
但是,在您的示例中,有一个更好的方法:像这样声明您的协议:
protocol Slide : class {
var title: String { get set }
}
Run Code Online (Sandbox Code Playgroud)
现在这个代码是合法的!
for slide in slides! {
slide.title = "New title"
}
Run Code Online (Sandbox Code Playgroud)
为什么?因为您现在已经保证 Slide 的采用者是一个类,而一个类是一个引用类型并且可以在适当的位置进行变异。之前失败的唯一原因是 Swift 担心采用者可能是一个结构体。
| 归档时间: |
|
| 查看次数: |
2353 次 |
| 最近记录: |