使用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?
"
我彻底困惑。我希望能够深入了解类型系统为什么要这样做。
答案 0 :(得分:3)
在
var vc = StoryboardScene.Challenges.acceptedViewController()
(vc as? Pagable)?.pageIndex = index
vc
是一个变量,但(vc as? Pagable)
是一个不可变的表达式。
解决方案是声明一个"类专用协议":
protocol Pagable : class {
var pageIndex: Int? { get set }
}
然后编译器知道所有符合类型的引用类型, 这样即使引用本身也可以赋予属性 是不变的。