错误:无法将“[String]”类型的值分配给 swift 中的“String”类型

Posted

技术标签:

【中文标题】错误:无法将“[String]”类型的值分配给 swift 中的“String”类型【英文标题】:Error: Cannot assign value of type '[String]' to type 'String' in swift 【发布时间】:2020-05-19 19:36:31 【问题描述】:

我正在尝试使用具有多个部分的 tableview 创建搜索过滤器,并在“cell?.textLabel?.text = self .searchArray[indexPath.row].rowTitles”。我该如何解决?最终目标是能够在 tableview 的各个部分中显示 rowTitles。这是我的代码。

import UIKit

class ViewController: UIViewController 

    @IBOutlet weak var searchBar: UISearchBar!
    @IBOutlet weak var tableView: UITableView!

    let dataArray = [(sectionTitle: "section 1", rowTitles: ["row 1", "row 2"]),
    (sectionTitle: "section 2", rowTitles: ["row 1", "row 2", "row 3"]),
    (sectionTitle: "section 3", rowTitles: ["row 1"]),
    ]
    var searchArray = [(sectionTitle: String, rowTitles: [String])]()
    var searching = false

    override func viewDidLoad() 
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
    


extension ViewController: UITableViewDelegate, UITableViewDataSource 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        if searching 
            return searchArray.count
         else 
            return dataArray.count
        
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "searchCell")
        if searching 
            cell?.textLabel?.text = self.searchArray[indexPath.row].rowTitles
         else 
            cell?.textLabel?.text = self.dataArray[indexPath.row].rowTitles
        
        return cell!
    
    func numberOfSections(in tableView: UITableView) -> Int 
        return self.dataArray.count
    



extension ViewController: UISearchBarDelegate 
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) 
        searchArray =  dataArray.filter($0.sectionTitle.lowercased().contains(searchBar.text!.lowercased()) )
        searching = true
        tableView.reloadData()
    

【问题讨论】:

另外你应该避免强制展开返回单元格! 【参考方案1】:

首先不要使用元组作为数据源数组。使用结构。

有很多问题。基本上你根本没有考虑section 信息。您必须使用indexPath.section 获取当前部分,并使用indexPath.row 获取当前行

numberOfRowsInSection 替换为

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    if searching 
        return searchArray[section].rowTitles.count
     else 
        return dataArray[section].rowTitles.count
    

cellForRow

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "searchCell", for: indexPath)
    if searching 
        cell.textLabel?.text = self.searchArray[indexPath.section].rowTitles[indexPath.row]
     else 
        cell.textLabel?.text = self.dataArray[indexPath.section].rowTitles[indexPath.row]
    
    return cell

【讨论】:

【参考方案2】:

self.searchArray[indexPath.row].rowTitles 是字符串数组,而不是字符串。

cell.textLabel.text 是一个字符串值,因此您不能将第一个分配给后者。

我认为您应该使用 rowTitles 中的一个字符串并将其分配给 textLabel.text

希望这有帮助!

【讨论】:

【参考方案3】:

因为 cell?.textLabel?.text 需要 String 类型,而您将 Strings 的数组 (rowTitles) 传递给它。

尝试从您的数组 (rowTitles) 中传递一个字符串(根据您的要求),它就会消失。

if searching 
    cell?.textLabel?.text = self.searchArray[indexPath.row].rowTitles[0]
 else 
    cell?.textLabel?.text = self.dataArray[indexPath.row].rowTitles.first[1]

【讨论】:

以上是关于错误:无法将“[String]”类型的值分配给 swift 中的“String”类型的主要内容,如果未能解决你的问题,请参考以下文章

无法将“String”类型的值分配给“UILabel”类型

无法将 String 类型的值分配给 AnyObject 类型?斯威夫特 3.0

无法将类型“类”的值分配给类型“[类]”

Swift 无法将类型“()”的值分配给类型“字符串?”

错误:无法分配类型“字符串?”的值键入“字符串?。类型”

无法将“String”类型的值分配给“MyOrderTableViewCell”类型