Swift 条件绑定

Swift conditional binding

我正在使用 Swift 构建一个 iOS 应用程序。我有三个 UIViewControllers 和一个枚举,当我想使用 segue 来呈现它们时。

class a: UIViewController {}
class b: UIViewController {}
class c: UIViewController {}

我正在编写一个函数来迭代它们,如果 c 是当前函数,那么我需要设置一个 属性。然后稍后使用我的 a,b,c 实例。

// Segues 
func segue(sender: Button) {
    let title = sender.destination!
    switch title {
    case .NewWorkout:
        let VC: NewWorkout = NewWorkout()
    case .Home:
        let VC: Home = Home()
    case .Preview:
        let VC: WorkoutPreview = WorkoutPreview()
        VC.type = .allWorkouts
    } // 1

    self.presentViewController(VC, animated: true, completion: nil) // 2
}

我得到的错误是 Expected expression in assignment 在第 1 行和 Use of unresolved identifier "VC" 在第 2 行。我知道我的问题是 VC 是在 switch 语句中创建的并且在其独家新闻之外不可用。谢谢。

只需定义 VC 变量 switch 语句之前:

let VC : UIViewController

switch title {
    case .NewWorkout:
        VC = NewWorkout()
    case .Home:
        VC = Home()
    case .Preview:
        let workoutPreview = WorkoutPreview()
        workoutPreview.type = .allWorkouts
        VC = workoutPreview
}

self.presentViewController(VC, animated: true, completion: nil)

请注意,您可以使用 letVC 声明为(非可选)常量 如果所有可能的枚举值都在开关中处理。如有必要,您可以添加一个

    default:
       fatalError("Unexpected title")

您的问题是您在开关内部声明了 VC,因此当您使用 VC 进行 segue 时,它​​不知道 VC 是什么。 VC 超出了 presentViewController 的范围。您可以采用以下一种方法:

func segue(sender: Button) {
    let title = sender.destination!
    var VC:UIViewController
    switch title {
        case .NewWorkout:
            VC = NewWorkout()
        case .Home:
            VC = Home()
        case .Preview:
            VC = WorkoutPreview()
            VC.type = .allWorkouts
    } // 1

    self.presentViewController(VC, animated: true, completion: nil) // 2
}

所以现在 VC 与调用 presentViewController 的范围相同。

我想你可能想要这样的东西:

//: Playground - noun: a place where people can play

import UIKit

enum ControllerType {
    case allWorkouts
}

class NewWorkoutController: UIViewController { }
class HomeController: UIViewController { }
class WorkoutPreviewController: UIViewController {
    var type: ControllerType?
}

enum Destination {
    case NewWorkout
    case Home
    case Preview

    var controller: UIViewController {
        switch self {
        case NewWorkout:
            return NewWorkoutController()
        case Home:
            return HomeController()
        case Preview:
            let vc = WorkoutPreviewController()
            vc.type = .allWorkouts
            return vc
        }
    }
}

class Button: UIButton {
    var destination: Destination?
}

class ViewController: UIViewController {
    func segue(sender: Button) {
        if let vc = sender.destination?.controller {
            self.presentViewController(vc, animated: true, completion: nil)
        }
    }
}