解决 swift 中冲突的结构值类型
Resolving conflicting struct value types in swift
我有一个 UITableViewController。每行都从一个全局数组中填充。
这个全局数组描述了任务的标题。每个任务都有一些相关的字符串变量。
我希望能够单击 table 视图控制器中的任务标题,并将相关变量链接到该标题。
全局数组将随着最终用户在全局数组中添加或删除标题而增长和缩小。
这是用结构做的。该结构包含特定变量。
这个例子中的问题出现在加载函数中。
我无法加载数据,因为 Programs = loadedData
无法将类型“[String]”的值分配给类型“[Item]”。
import UIKit
struct Item {
let title:String
let others:[String]
}
var Programs = [Item]()
class ProgramList: UIViewController, UITableViewDataSource, UITableViewDelegate{
@IBOutlet weak var programTableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
load()
}
override func viewDidAppear(_ animated: Bool) {
programTableView.reloadData()
save()
}
//saving current state of programs array
func save(){
UserDefaults.standard.set(Programs, forKey: "notes")
}
//loading saved program array
func load() {
if let loadedData: [String] = UserDefaults.standard.value(forKey: "notes") as? [String] {
Programs = loadedData
programTableView.reloadData()
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return Programs.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
cell.programTitle.text = Programs[indexPath.row].title
return cell
}
//Removing Item by swipping left & saving this newly established array
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == UITableViewCell.EditingStyle.delete {
Programs.remove(at: indexPath.row)
programTableView.reloadData()
save()
}
}
}
你需要
programs = loadedData.map { Item(title:[=10=],others:[])}
顺便说一句,你可以让它像
一样 Codable
struct Item:Codable {
和 save/load 它与 encoder/decoder
我有一个 UITableViewController。每行都从一个全局数组中填充。 这个全局数组描述了任务的标题。每个任务都有一些相关的字符串变量。
我希望能够单击 table 视图控制器中的任务标题,并将相关变量链接到该标题。 全局数组将随着最终用户在全局数组中添加或删除标题而增长和缩小。
这是用结构做的。该结构包含特定变量。
这个例子中的问题出现在加载函数中。
我无法加载数据,因为 Programs = loadedData
无法将类型“[String]”的值分配给类型“[Item]”。
import UIKit
struct Item {
let title:String
let others:[String]
}
var Programs = [Item]()
class ProgramList: UIViewController, UITableViewDataSource, UITableViewDelegate{
@IBOutlet weak var programTableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
load()
}
override func viewDidAppear(_ animated: Bool) {
programTableView.reloadData()
save()
}
//saving current state of programs array
func save(){
UserDefaults.standard.set(Programs, forKey: "notes")
}
//loading saved program array
func load() {
if let loadedData: [String] = UserDefaults.standard.value(forKey: "notes") as? [String] {
Programs = loadedData
programTableView.reloadData()
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return Programs.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
cell.programTitle.text = Programs[indexPath.row].title
return cell
}
//Removing Item by swipping left & saving this newly established array
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == UITableViewCell.EditingStyle.delete {
Programs.remove(at: indexPath.row)
programTableView.reloadData()
save()
}
}
}
你需要
programs = loadedData.map { Item(title:[=10=],others:[])}
顺便说一句,你可以让它像
一样 Codablestruct Item:Codable {
和 save/load 它与 encoder/decoder