代码之家  ›  专栏  ›  技术社区  ›  AndrewSB

奇怪的Swift协议行为[重复]

  •  0
  • AndrewSB  · 技术社区  · 10 年前

    在使用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 回复  |  直到 10 年前
        1
  •  3
  •   Martin R    10 年前

    在里面

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

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

    解决方案是声明一个“仅类协议”:

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

    然后编译器知道所有符合类型都是 引用类型 , 这样,即使引用本身 是恒定的。