无法将 [Struct] 类型的值快速转换为 [string] 类型

Posted

技术标签:

【中文标题】无法将 [Struct] 类型的值快速转换为 [string] 类型【英文标题】:cannot convert value of type [Struct] to type [string] in coercion swift 【发布时间】:2017-11-17 00:23:25 【问题描述】:

我收到了这个错误:

无法将类型 [Destinos] 的值转换为类型 [String] 的强制 swift

我有这个结构:

public struct Destinos: Data public var idDestino : Int? public var desDestino : String?

还有这个:

var listado = [Destinos]() listado.append(Destinos(idDestino: 1, desDestino: "Asunción")) listado.append(Destinos(idDestino: 2, desDestino: "Miami"))

然后:

var ListaDeDestinos = [String]()

所以我的错误出现在这一行:

ListaDeDestinos = DestinoLista.listado as [String]

这里有什么问题?可以帮帮我吗?我在论坛里找不到类似的东西

编辑 我所有的代码:

import UIKit

类 API

let Presentador: DestinoPresenter! // referenciamos la clase DestinoPresenter en una variable local

init(Present: DestinoPresenter) // constuctor: inicializamos la variable Presentador y creamos una copia de la clase DestinoPresenter
    Presentador = Present


var listado = [Destinos]()


func GetDestinos()


    listado.append(Destinos(idDestino: 1, desDestino: "Asunción"))
    listado.append(Destinos(idDestino: 2, desDestino: "Miami"))


    print(listado)


类 DestinoPresenter

let mview: ViewController // referenciamos la clase DestinoPresenter en una variable local

init(view: ViewController)  //construnctor
    mview = view


var ArrayAutoComplete = [String]()
var ListaDeDestinos = [String]()
fileprivate var DestinoLista: Api!


func searchDestinos(_ substring: String) 

    ArrayAutoComplete.removeAll() //cada vez que llamemos a esta funcion, limpiamos la variable ArrayAutoComplete del TableView

    DestinoLista = Api(Present: self)
    DestinoLista.GetDestinos()

// ListaDeDestinos = [(DestinoLista.listado as AnyObject) as!细绳] ListaDeDestinos = DestinoLista.listado as [String]

    for key in ListaDeDestinos 

        let myString:NSString! = key as NSString

        if (myString.lowercased.contains(substring.lowercased())) 
            print(myString.contains(myString as String) ? "yep" : "nope")
            ArrayAutoComplete.append(key)

        
    

    mview.mostarResultados(ArrayResultados: ArrayAutoComplete) //llamamos a la función y le pasamos como parametro ArrayAutoComplete


类视图控制器:UIViewController

@IBOutlet weak var textField: UITextField! = nil
@IBOutlet weak var tableView: UITableView! = nil

var autoCompleteDestino: [String] = []

fileprivate var DestinoP: DestinoPresenter!

override func viewDidLoad() 
    super.viewDidLoad()

    //LEER: pasando como referencia tu vista
    DestinoP = DestinoPresenter(view: self)


    title = "Texto predecible"

// DestinoP.getDestinos() // DestinoP.ListarDestinos()


func mostarResultados(ArrayResultados: [String]) 

    autoCompleteDestino = ArrayResultados
    tableView.reloadData()


扩展视图控制器:UITextFieldDelegate

public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 

    let substring = (textField.text! as NSString).replacingCharacters(in: range, with: string)

    DestinoP.searchDestinos(substring)

    return true


扩展视图控制器:UITableViewDataSource // Completa el string encontrado en el tableView segun caracter ingresado en el textField 公共 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 让 cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as UITableViewCell 让 index = indexPath.row as Int

    cell.textLabel!.text = autoCompleteDestino[index]

    return cell

扩展视图控制器:UITableViewDelegate

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    return autoCompleteDestino.count


//    selecciona el resultado desde el tableView para completar en el textField.
public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 

    let selectedCell: UITableViewCell = tableView.cellForRow(at: indexPath)!

    textField.text = selectedCell.textLabel!.text!


【问题讨论】:

你想达到什么目的? 嗨!我正在尝试将列表的结果 (listado) 存储在我的 var (ListaDeDestinos) 中,然后显示 (...) 如果您不理解我可以给您完整的代码 我认为您需要遍历 listado 并仅提取 desDestino 成员变量。现在你告诉编译器把一个结构体变成一个字符串,它不知道怎么做 Destinos 不是String。您需要一些方法将Destinos 转换为String(实现CustomStringConvertible 是一种流行的方法,但还有许多其他方法可以做到这一点)。基本问题是您希望Destinos 的“字符串版本”是什么。你必须自己定义。如果您只是想要“可用于调试的东西”,请使用 String(describing:) 创建每个元素的字符串版本。 【参考方案1】:

如果您想要每个 listados 对象的字符串成员变量,请执行以下操作:

for object in DestinoLista.listados 
    ListaDeDestinos.append(object.desDestino)

【讨论】:

是的..!!这行得通!对于 DestinoLista.listado 中的对象 ListaDeDestinos.append(object.desDestino!) 【参考方案2】:

不清楚您想要“Destinos 的字符串版本”是什么。如果你真的不在乎,只是想要“一些可用于调试的东西”,那么将其映射到 String(describing:)

let listaDeDestinos = listado.map(String.init(describing:))

【讨论】:

以上是关于无法将 [Struct] 类型的值快速转换为 [string] 类型的主要内容,如果未能解决你的问题,请参考以下文章

快速数组无法将“AnyObject”类型的值转换为预期的参数类型@noescape(AnyObject)抛出-> Bool

在 Xcode 8.3.2 的 UI 测试用例中转换为当前的快速语法“无法调用非函数类型‘XCUIElement’的值”时出错

无法将类型“()”的值转换为预期的参数类型“字符串”

如何将STRING类型的值转换为BASE64 STRING类型的值

Swift“无法将''类型的值转换为'String'类型

无法将“字符串”类型的值转换为预期的参数类型 [任何]