我编写了一个协议和相应的扩展,它使用简单的StringStack
与"<origin>@<destination>"
形式的命名约定一起在我的Swift应用程序中执行嵌套视图之间的segue。我是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
}
}
}
我最初的问题是协议扩展中不允许使用变异函数,详见本bug report。该报告中提出了一种建议的解决方法,但以下结果导致错误声称'SegueForwardAndBackward' is not a subtype of 'UIViewController'
。
class A: UIViewController, SegueForwardAndBackward {
mutating func testFunc() {
var p: SegueForwardAndBackward = self
p.performBackwardSegue()
}
}
我确实遇到了一个潜在的解决方案,我可以在another question中详细说明SegueForwardAndBackward
类协议。但是,实现类协议会导致段错误,我认为这是因为我声明我的扩展名为where Self: UIViewController
,不幸的是我不知道如何解决这个问题。
目前我对Swift中的另一个错误感到非常沮丧,所以任何重新修改我的方法或解密这些错误的帮助都会非常感激。
提前感谢您的回复!
答案 0 :(得分:0)
这个question似乎解决了嵌套前进和后退按钮的替代解决方案,所以没有任何其他响应,这就是我将要使用的内容。但是,我提出的问题在swift中仍然是一个非常奇怪的错误。