Swiftアプリケーションでネストされたビュー間でセグエを実行するために、単純なStringStack
形式の命名規則と並行して使用するプロトコルと対応する拡張機能を作成しました。"<origin>@<destination>"
私は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
で詳しく説明されているように、クラスプロトコルを作成できる潜在的な解決策に出くわしました。ただし、クラス プロトコルを実装すると segfault が発生します。これは、拡張機能を と宣言しているためと思われますが、残念ながらこれを解決する方法がわかりません。where Self: UIViewController
現時点では、Swift のさらに別のバグのように見えるものに非常に不満を感じているため、アプローチを作り直すか、これらのエラーを解読するための助けをいただければ幸いです。
ご回答ありがとうございます。