2014-09-12 343 views
0

我正尝试使用Xcode 6和Swift构建待办事宜应用程序。我能够运行的Xcode 6 DP2的应用程序,但更新后DP7我得到这个错误:'bool'不能转换为'uint8'

'bool' is not convertible to 'uint8'. 

这里是有错误的功能:

override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) { 

     **if ((segue && segue!.identifier == "showdetails") != nil)**{ 
      var selectedIndexPath:NSIndexPath = self.tableView.indexPathForSelectedRow() 

      var detailViewController:DetailViewController = segue!.destinationViewController as DetailViewController 

      detailViewController.toDoData = toDoItems.objectAtIndex(selectedIndexPath.row) as NSDictionary 

     } 

    } 

回答

1

正确的方式来写那就是:

if (segue != nil && segue!.identifier == "showdetails") { 

但更好的方法是使用可选的结合:

if let segue = segue { 
    if (segue.identifier == "showdetails") { 

请注意,还有其他有关选项卡使用不当的错误。这是修改后的代码,在操场编译:

if let segue = segue { 
    if (segue.identifier == "showdetails") { 
     var selectedIndexPath:NSIndexPath? = self.tableView.indexPathForSelectedRow() 
     if let selectedIndexPath = selectedIndexPath { 
      var detailViewController:DetailViewController = segue.destinationViewController as DetailViewController 

      detailViewController.toDoData = toDoItems.objectAtIndex(selectedIndexPath.row) as NSDictionary 
     } 
    } 
} 

indexPathForSelectedRow返回一个可选的,所以你必须考虑到这一点。

更新:由@MartinR指出,segue不再是可选的,所以你可以通过简单地更新函数签名解决这个问题,它的实施应该是这样的:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == "showdetails") { 
     var selectedIndexPath = self.tableView.indexPathForSelectedRow() 
     if let selectedIndexPath = selectedIndexPath { 
      var detailViewController = segue.destinationViewController as DetailViewController     
      detailViewController.toDoData = toDoItems.objectAtIndex(selectedIndexPath.row) as NSDictionary 
     } 
    } 
} 
+2

但请注意'segue' *不是'prepareForSegue()'的可选参数:https://developer.apple.com/library/prerelease/iOS/documentation/UIKit/Reference/UIViewController_Class/index。 html#// apple_ref/occ/instm/UIViewController/prepareForSegue:sender:。 – 2014-09-12 21:30:47

+0

Thanks @MartinR - 很难跟踪哪些optionals不再是可选项,更不用说强制unwrapped了,现在是可选项... – Antonio 2014-09-12 21:46:15

0

首先当我读了documentation我读的是:

func prepareForSegue(_ segue: UIStoryboardSegue, sender sender: AnyObject?) 

的UIKit似乎β7的更新,以使用更少的自选项目。因此segue可能不是可选的。

然后即使你的函数签名是好的,你正在比较一个布尔值到零。

这个(segue && segue!.identifier == "showdetails")是一个布尔值。布尔值是真或假。

,并在最末端,这里是解开一个变量的最佳做法:

if let mySafeVariable = myOptionalVariable { 
    if mySafeVariable.attribute == <Whatever> { 

    } 
} 

你应该。不,等等,你必须阅读Swift免费的iBooks。