无法将 [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’的值”时出错