线程1:转换为String时发出信号SIGABRT

时间:2019-06-12 11:05:02

标签: swift xcode

我正在尝试将套接字数据有效载荷的结果添加到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")

该项目已添加,没有错误。

2 个答案:

答案 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)