我正在尝试将套接字数据有效载荷的结果添加到String数组中:
override func viewDidLoad() {
super.viewDidLoad()
let tableView = UITableView(frame: .zero, style: .plain)
tableView.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(tableView)
NSLayoutConstraint.activate([
self.view.safeAreaLayoutGuide.topAnchor.constraint(equalTo: tableView.topAnchor),
self.view.safeAreaLayoutGuide.bottomAnchor.constraint(equalTo: tableView.bottomAnchor),
self.view.leadingAnchor.constraint(equalTo: tableView.leadingAnchor),
self.view.trailingAnchor.constraint(equalTo: tableView.trailingAnchor),
])
self.tableView = tableView
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "UITableViewCell")
self.tableView.dataSource = self
let socket = manager.defaultSocket
socket.on(clientEvent: .connect) {data, ack in
print("socket connected")
self.refresh()
}
socket.on("request") {data, ack in
print("data is" , data[0])
self.items.append(String(data[0] as! String))
self.tableView.reloadData()
}
正在接收数据有效载荷作为行
print("data is" , data[0])
打印到控制台:
data is (
"this is a test message"
)
但是我不确定如何从data
中提取字符串文本。
第self.items.append(String(data[0] as! String))
返回错误:
Thread 1: signal SIGABRT
也使用
self.items.append(data[0])
返回编译器错误:
Cannot convert value of type 'Any' to expected argument type 'String'
如何添加到items
数组中并防止Thread 1: signal SIGABRT
和/或将data[0]
转换为String的正确方法是什么?
如果我对字符串进行硬编码并将其添加到数组中:
self.items.append("Test")
该项目已添加,没有错误。
答案 0 :(得分:3)
从控制台打印data[0]
是一个字符串数组,因此您可以尝试
if let arr = data.first as? [String] , let item = arr.first {
print("data is" ,item)
self.items.append(item)
}
上面的代码附加了第一项,由您自己来附加整个数组
self.items += arr
答案 1 :(得分:2)
似乎data
是[[String]]
,是一个嵌套数组。
安全包装和索引内容
print("data is" , data[0])
guard let innerArray = data.first as? [String],
let string = innerArray.first else { return }
self.items.append(string)
或者如果您想附加所有项目
guard let innerArray = data.first as? [String] else { return }
self.items.append(contentsOf: innerArray)