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)
请注意,您可以使用 let
将 VC
声明为(非可选)常量
如果所有可能的枚举值都在开关中处理。如有必要,您可以添加一个
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)
}
}
}
我正在使用 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)
请注意,您可以使用 let
将 VC
声明为(非可选)常量
如果所有可能的枚举值都在开关中处理。如有必要,您可以添加一个
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)
}
}
}