我有一个简单的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"]
,则代码可以正常工作。
有什么想法吗?
答案 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 : StringProtocol
(docs)
您必须传递String
或Substring
,其中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