2

我编写了一个协议和相应的扩展,它利用一个简单StringStack的形式与表单的命名约定"<origin>@<destination>"在我的 Swift 应用程序中的嵌套视图之间执行 segues。我是 swift 新手,所以如果有更好的方法来实现跨多个视图的本质上的前进和后退按钮,我愿意接受。但是,由于我在下面详述的原因,以下代码存在问题。

struct StringStack {
    var stack: Array = [String]()

    mutating func push(str: String)->Void {
        self.stack.append(str)
    }

    mutating func pop()->String {
        self.stack.popLast()
    }
}

protocol SegueForwardAndBackward {
    var thisIdentifier: String {get set}
    var segueStack: StringStack {get set}
}

extension SegueForwardAndBackward where Self: UIViewController {

    mutating func performForwardSegue(nextIdentifier: String) {
        let identifier: String = thisIdentifier + "@" + nextIdentifier
        segueStack.push(identifier)
        performSegueWithIdentifier(identifier, sender: self)
    }

    mutating func performBackwardSegue() {
        let divided = segueStack.pop().componentsSeparatedByString("@")
        // reverses destination and origin of identifier
        let segueIdentifier: String = divided[1] + "@" + divided[0]
        performSegueWithIdentifier(segueIdentifier, sender: self)
    }

    func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if var destinationViewController: SegueForwardAndBackward = segue.destinationViewController as? SegueForwardAndBackward {
            destinationViewController.segueStack = segueStack
        }
    }
}

我最初的问题是协议扩展中不允许变异函数,如本错误报告中所述。该报告中给出了一个建议的解决方法,但是以下导致错误声称'SegueForwardAndBackward' is not a subtype of 'UIViewController'.

class A: UIViewController, SegueForwardAndBackward {

    mutating func testFunc() {
        var p: SegueForwardAndBackward = self
        p.performBackwardSegue()
    }
}

我确实遇到了一个潜在的解决方案,我可以在另一个问题SegueForwardAndBackward中详细说明类协议。但是,实现类协议会导致段错误,我认为这是因为我将扩展声明为,不幸的是我不知道如何解决这个问题。where Self: UIViewController

目前,我对 Swift 中似乎又一个错误感到非常沮丧,所以任何帮助我修改我的方法或破译这些错误将不胜感激。

提前感谢您的回复!

4

1 回答 1

0

这个问题似乎解决了嵌套前进和后退按钮的替代解决方案,因此没有任何其他响应,这就是我将要使用的。但是,我提出的问题仍然是 swift 中一个非常奇怪的错误。

于 2016-05-27T17:19:25.687 回答