SwiftUI函数返回Text或Button?

4
我有一个简单的函数可以返回“Text”或“Button”,但是我遇到了以下错误:

函数声明了不透明的返回类型,但其主体中的返回语句没有匹配的底层类型

这是我的函数:
private func cellContent(for cell: Cell) -> some View {
  if (cell.editable) {
    return Button(action: { print("hi") }) { Text(cell.content) } 
  }
  return Text(cell.content)
}

我该如何修复这个问题或采用其他方式实现?

2个回答

4

这里是正确的变体。

注意:当您显式使用return时,ViewBuilder会被禁用,因此在使用它时必须删除return(s),否则将再次导致编译器错误。

已在Xcode 12 / iOS 14上进行测试。

@ViewBuilder
private func cellContent(for cell: Cell) -> some View {
  if (cell.editable) {
     Button(action: { print("hi") }) { Text(cell.content) }
  }
  Text(cell.content)
}

为什么要用括号?! - user652038
2
@Jessy,不要更改原始PO风格 - 谁知道,也许这是项目编码标准。 - Asperi
非常感谢您的理解,对于造成的困惑我深感抱歉。我只是匆忙构建一个快速的概念验证,还没有时间设置语法规则等等。 - user1354934
1
再次感谢@Asperi,删除回车是如此宝贵的提示! - dankito

1
这是使用 @ViewBuilder 的确切位置。 只需在您的函数开头添加一个 @ViewBuilder 即可:
@ViewBuilder
private func cellContent(for cell: Cell) -> some View {
  if (cell.editable) {
      Button(action: { print("hi") }) { Text(cell.content) } 
  }
      Text(cell.content)
}

@ViewBuilder是什么?你可以在互联网上获得详细信息,但一个好的且简短的解释是它正如本例所做的那样!它将闭包转换为视图,同时消除编译错误。
正如评论中所说,你也应该删除返回语句,@ViewBuilder将把整个函数的闭包转换为一个新的单一视图,并自动返回该新视图,因此不需要显式的返回语句。

谢谢!只是在Xcode和@asperi的回答中需要注意,必须删除返回才能正常工作! - user1354934
你说得对!我没有在Xcode中检查,所以错过了它。我会进行编辑。 - Mahdi BM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接