奇怪的Swift协议行为

时间:2016-01-15 20:15:04

标签: ios swift protocols swift-protocols

使用swift协议来简化UIPageViewController时遇到问题:

我有这个协议

protocol Pagable {
    var pageIndex: Int? { get set }
}

我将UIPageViewController呈现的所有UIViewControllers都符合。

然后在我的UIPageViewController中,我这样做:

var vc = StoryboardScene.Challenges.acceptedViewController() as! Pagable   
vc.pageIndex = index
return vc as? UIViewController

有效,但我真正想做的是:

var vc = StoryboardScene.Challenges.acceptedViewController()
(vc as? Pagable)?.pageIndex = index
return vc

由于某种原因,每当我这样做时(对我来说感觉与片段1完全相同),我在(vc as? Pagable)?.pageIndex = index上得到一个错误,说"不能分配给类型的不可变表达式Int?"

我彻底困惑。我希望能够深入了解类型系统为什么要这样做。

1 个答案:

答案 0 :(得分:3)

var vc = StoryboardScene.Challenges.acceptedViewController()
(vc as? Pagable)?.pageIndex = index

vc是一个变量,但(vc as? Pagable)是一个不可变的表达式。

解决方案是声明一个"类专用协议":

protocol Pagable : class {
    var pageIndex: Int? { get set }
}

然后编译器知道所有符合类型的引用类型, 这样即使引用本身也可以赋予属性 是不变的。