下面显示的Swift(2)函数返回一个包含两个UIAlertAction实例cancelAction和doNotCancelAction的元组。在设置If语句代码块之前,实例按预期返回。
添加包含创建两个UIAlertAction实例的条件if代码块后,返回的元组中的两个条目现在被Xcode 7.0.1标记为未解析的标识符错误。
不确定为什么在if代码块中插入实例分配会导致此错误。
是否存在关于在func声明中定义元组然后尝试在if代码块中分配它会导致此错误的事情?
任何人都可以帮助我理解我在这里做错了什么。
以下是代码段:
struct UserInputValidation {
static var textHasChanged = false
static var editMode: EditMode?
// ...
private static func setActions(segueName: String, controller: UITableViewController) -> (cancelAction: UIAlertAction, doNotCancelAction: UIAlertAction)
{
if (segueName == "exitToEntityTopicsListingTableViewController")
{
let cancelAction = UIAlertAction(title: "Yes", style: UIAlertActionStyle.Cancel) { (action) in
controller.performSegueWithIdentifier(segueName, sender: controller)
self.textHasChanged = false
}
let doNotCancelAction = UIAlertAction(title: "No", style: .Default) { (action) in
}
}
return (cancelAction, doNotCancelAction)
} }
答案 0 :(得分:0)
在return语句中,返回一个可能尚未实例化的值。因此,如果segue名称不是“exitToEntityTopicsListingTableViewController”,则不会返回任何cancelAction
和doNotCancelAction
。
您必须将return语句移动到if块中,或者实例化cancelAction
和doNotCancelAction
的默认值
答案 1 :(得分:0)
这个错误消息是由于未能实现基本概念而导致的,因为块内创建的任何var或常量都是块的本地,并且在块外部使用时无法解析。
解决方案是将if块之外的两个常量的声明移动到func块中。
另外,不得不从常量变为var,因为我不能预先指定常量,因为它们不再位于if块中。
所以代码现在看起来像:
private static func setActions(segueName: String, controller: EditTopicAndContentTableViewController) -> (cancelAction: UIAlertAction, doNotCancelAction: UIAlertAction)
{
var cancelAction: UIAlertAction!
var doNotCancelAction: UIAlertAction!
// User exits topic and content edit page with unsaved changes - yes continues exit.
if (segueName == "exitToEntityTopicsListingTableViewController")
{
cancelAction = UIAlertAction(title: "Yes", style: UIAlertActionStyle.Cancel) { (action) in
controller.performSegueWithIdentifier(segueName, sender: controller)
self.textHasChanged = false
}
doNotCancelAction = UIAlertAction(title: "No", style: .Default) { (action) in
}
}
// User accesses edit keywords page with unsaved changes which keywords edit needs changes to be saved.
// Yes is save changes and continue to keywords edit page.
else if (segueName == "editKeywords")
{
cancelAction = UIAlertAction(title: "No", style: UIAlertActionStyle.Cancel) { (action) in
}
doNotCancelAction = UIAlertAction(title: "Yes", style: .Default) { (action) in
controller.saveTopicAndContentToCoreData(controller.coreDataStack)
self.textHasChanged = false
controller.performSegueWithIdentifier(segueName, sender: controller)
}
}
return (cancelAction, doNotCancelAction)
}