我真的是编程新手,我正在开发一个与运动和位置有关的应用程序。我无法从“词典”中获取特定项目,但是“词典”并不是真正的字典。
基本上,我有一个表视图,其中包含从Firebase Firestore数据集中获取的数据行,在点击一行后,我想将该行中的数据获取到另一个场景。
我尝试搜索类似的问题,但是输出
人员(名称:“ Test3”,邮政编码:“ 33333”,运动:“网球”,电子邮件:“ test3@email.com”)
(来自print(tappedRow)
的)在我尝试let tappedEmail = tappedRow[3]
时没有下标
我也尝试通过执行tappedRow
将let tappedRow: Dictionary = peopleView.people[number] as! Dictionary
转换为字典,但是据说这总是失败并给出错误
不能强制将'Person'类型的值转换为'Dictionary <_,_>'类型
这是代码的主要部分:
let number = myIndex
let tappedRow = peopleView.people[number]
print (tappedRow)
let tappedEmail = tappedRow[3] <- Value of type 'Person' has no subscripts
print(tappedEmail)
let tappedUser = FirebaseFirestore.root.collection("users").document(tappedEmail)
peopleView是这个:
var myIndex = 0
var selectedPerson = ""
struct Person {
let name, zip, sport, email: String
}
class PeopleViewController: UITableViewController {
@IBOutlet var table: UITableView!
var people = [Person]() as Dictionary
private var document: [DocumentSnapshot] = []
override public func viewDidLoad() {
super.viewDidLoad()
peopleView = self
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let person = people[indexPath.row]
let cell = self.table.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! Cell
cell.name.text = person.name
cell.sport.text = person.sport
cell.zip.text = person.zip
cell.email.text = person.email
return cell
}
override public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
myIndex = indexPath.row
performSegue(withIdentifier: "toTappedUser", sender: self)
}
我期望它将带走被窃听的行,并从字典集中删除“电子邮件”,并使用它从Firebase调用getDocument
。实际发生的是我收到此错误:
“人物”类型的值没有下标
我认为原因是因为Person(name: "Test3", zip: "33333", sport: "Tennis", email: "test3@email.com")
并不是真正的字典,因为开头是Person
,所以我想以某种方式将其转换为真实的字典,然后使用{{1} }。
我刚开始使用Firebase,所以很感谢。
答案 0 :(得分:1)
什么都不做。请尝试了解错误
不能强制将'Person'类型的值转换为'Dictionary <_,_>'类型
表示Person
与Dictionary
不相关。无论如何,桥强制转换毫无意义,因为自定义结构比字典更具体
var people = [Person]()
类型
Person
没有下标
默认情况下,自定义结构没有下标。而且,按索引进行下标还是错误的。看一下cellForRowAt
中的代码,这里有获取例如struct成员值的正确方法
let tappedEmail = tappedRow.email
请阅读Language Guide以了解基础知识。