Swift switch case编译错误

时间:2014-06-06 18:52:17

标签: swift

以下代码是WWDC中的中级Swift谈话示例的派生。我想要做的是从一个键属性列表初始化一个模型类,它来自某种API。

class Movie {
  var title: String

  init(title: String) {
    self.title = title
  }
}

func movieFromDictionary(dict: Dictionary<String, AnyObject>) -> Movie? {
  switch dict["title"] {
  case .Some(let movieTitle as String):
    return Movie(title: movieTitle)
  default:
    return nil
  }
}

当我尝试编译这些时,我收到以下错误:

Bitcast requires both operands to be pointer or neither
  %38 = bitcast i8* %37 to %SS, !dbg !161
Invalid operand types for ICmp instruction
  %39 = icmp ne %SS %38, null, !dbg !161
PHI nodes must have at least one entry.  If the block is dead, the PHI should be removed!
  %42 = phi i64 , !dbg !161
PHI node operands are not the same type as the result!
  %41 = phi i8* [ %38, %34 ], !dbg !161
LLVM ERROR: Broken function found, compilation aborted!
Command /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift failed with exit code 1

有趣的是,编辑似乎对代码没问题。这是编译器错误还是代码有问题?

3 个答案:

答案 0 :(得分:1)

我同意评论者这是一个编译器错误,你应该向苹果报告。但是,你也可以用这种方式实现它,这更简单,应该可以正常工作:

func movieFromDictionary(dict: Dictionary<String, AnyObject>) -> Movie? {
  if let title = dict["title"] as? String {
    return Movie(title: title)
  }
  else {
    return nil
  }
}

答案 1 :(得分:0)

我有一个类似的问题,发现如果我提取了我先打开的东西,那么一切都运行正常,即。

而不是

switch segue.sourceViewController {
    case let c as XYZAddToDoItemViewController where c.toDoItem.name.utf16count > 0 :  toDoItems.append(c.toDoItem)
        tableView.reloadData()
    default: println("Unexpected source controller")
}

你应该首先声明你要开启的东西(并且它坚持使用AnyObject)

let s:AnyObject = segue.sourceViewController
switch s {
    case let c as XYZAddToDoItemViewController where c.toDoItem.name.utf16count > 0 :  toDoItems.append(c.toDoItem)
        tableView.reloadData()
    default: println("Unexpected source controller")
}

答案 2 :(得分:0)

switch dict["title"] {
case .Some(let movieTitle as String):

我刚刚遇到类似的东西,也有字典。问题似乎是我称之为双重演员。 dict["title"]AnyObject! - 也就是说,它是一个可选项。它隐含地解开的事实暂时无关紧要。现在你要求将它转换为String。所以你要一次采取两个铸造步骤:

  • 您要解包可选
  • 你想要在Optional中输入一个可以转换成字符串的内容

这种双重转换会给编译器带来麻烦。它应该提供更好的错误消息,并且由于此问题很容易重现,因此您应该提交错误消息。尽管如此,我认为这种双重铸造是错误的。你必须分两步完成它(如上面的项目符号):首先找出dict["title"]是否为零,然后只有这样,如果不是,则打开它并查看是否可以转换为String。 / p>

(NSDictionary和Dictionary之间的相互作用并不像它可能那么干净,这种情况没有帮助。在我的情况下,事情变得更加复杂,因为字典是用户默认的,所以它< em>本身是一个可选项。)