不符合String协议SwiftUI Picker View

时间:2019-11-18 06:11:08

标签: swiftui

我有一个简单的struct,我将以此为基础。现在它有一个字段,一个Int。

struct Card: CustomStringConvertible  {
  let value: Int

  init(value: Int) {
    self.value = value
  }

  var description: String {
    return "\(String(value))"
  }
}

如果我这样做,我会得到卡片以打印出它的价值

let c = Card(value: 1)
print(c)

现在,如果我像这样在CardController中放置一系列Card:

class CardController: ObservableObject {
  @Published
  var cards: [Card] = [
    Card(value: 1),
    Card(value: 2),
    Card(value: 3)
  ]

Picker(selection: $selectedCardValue, label: Text("Choose a card")) {
        ForEach(0..<cardController.cards.count) {
          Text(self.cardController.cards[$0])
        }
      }
      Text("You selected \(selectedCardValue)")

我将收到错误Initializer 'init(_:)' requires that 'Card' conform to StringProtocol。我不确定为什么会收到此错误。如果我只是将cards更改为类型[String]和值["1", "2", "3"],则代码可以正常工作。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如E.Coms所述,解决方案是使用以下方法之一:

Text(self.cardController.cards[$0].description)

Text(String(describing: self.cardController.cards[$0]))

以下是为什么的说明,您必须在Text初始化程序中执行此操作,而不是print()


查看Text的两个初始化器:

init(verbatim content: String)docs

init<S>(_ content: S) where S : StringProtocoldocs

您必须传递StringSubstring,其中only two types符合StringProtocol。在这种情况下,即使您的类型符合CustomStringConvertible,您仍在传递Card


将此与print函数进行对比:

func print(_ items: Any..., separator: String = " ", terminator: String = "\n")docs

请注意,print函数的参数由Any表示,is explained as

  

任何人都可以代表任何类型的实例,包括函数类型。

无论您将print function then converts传递给String

  

每个项目的文本表示形式与通过调用String(item)获得的文本表示形式相同。

String有一个initializer,它的类型符合CustomStringConvertible,并返回description属性。


所以您可以写print(Card())而不写Text(Card()的原因是因为打印功能通过String的中间步骤可以理解您对CustomStringConvertible的遵循,但是{ {1}}否。如果Text允许您传递任何类型的参数,则两者都将更加模棱两可(“该类型的文本表示是什么?”并不一定会立即显现出来,因为它取决于一组协议的层次结构),并且SwiftUI系统还有更多工作要做,这已经做了很多工作。

答案 1 :(得分:0)

您可能会偶然错过 <data name="NavigatorImageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64"> <value> AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAB2 1gAAAk1TRnQBSQFMAgEBYwEAAYgBAgGIAQIBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA AwABkAEBAgABAQEAARAGAAHIJgABeAEtAfABHAHwARwB8AEcAfABHAHwARwWAAG4ATUBMAElATABJQEw ... and many many more lines like this...

description