I got this error:
我收到了这个错误:
cannot convert value of type [Destinos] to type [String] in coercion swift
不能将[Destinos]类型的值转换为强制swift中的[String]类型
I have this Struct:
我有这个结构:
public struct Destinos: Data { public var idDestino : Int? public var desDestino : String? }
public struct Destinos:Data {public var idDestino:Int? public var desDestino:String? }
and this:
var listado = [Destinos]() listado.append(Destinos(idDestino: 1, desDestino: "Asunción")) listado.append(Destinos(idDestino: 2, desDestino: "Miami"))
var listado = [Destinos]()listado.append(Destinos(idDestino:1,desDestino:“Asunción”))listado.append(Destinos(idDestino:2,desDestino:“Miami”))
then:
var ListaDeDestinos = [String]()
so my error appears in this line:
所以我的错误出现在这一行:
ListaDeDestinos = DestinoLista.listado as [String]
What is wrong here? can help me please? i´m don´t find anything like this in the forums
这有什么不对?可以帮帮我吗?我在论坛里找不到这样的东西
Edit all my code:
编辑我的所有代码:
import UIKit
class Api {
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)
}
}
class DestinoPresenter {
class 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! String] ListaDeDestinos = DestinoLista.listado as [String]
// ListaDeDestinos = [(DestinoLista.listado as AnyObject)as! String] 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
}
}
class ViewController: UIViewController {
class ViewController: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()
// DestinoP.getDestinos()// DestinoP.ListarDestinos()
}
func mostarResultados(ArrayResultados: [String]) {
autoCompleteDestino = ArrayResultados
tableView.reloadData()
}
}
extension ViewController: UITextFieldDelegate {
扩展ViewController: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
}
}
extension ViewController: UITableViewDataSource { // Completa el string encontrado en el tableView segun caracter ingresado en el textField public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as UITableViewCell let index = indexPath.row as Int
扩展ViewController:UITableViewDataSource {// Completa el string encontrado en el tableView segun caracter ingresado en el textField public func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath) - > UITableViewCell {let cell = tableView.dequeueReusableCell(withIdentifier:“cell” ,for:indexPath)as UITableViewCell让index = indexPath.row作为Int
cell.textLabel!.text = autoCompleteDestino[index]
return cell
}
}
extension ViewController: UITableViewDelegate {
扩展ViewController: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!
}
}
2 个解决方案
#1
1
If you wanted the string member variable of each listados object, do:
如果您想要每个listados对象的字符串成员变量,请执行以下操作:
for object in DestinoLista.listados {
ListaDeDestinos.append(object.desDestino)
}
#2
1
It's not clear what you want "the string version of Destinos
" to be. If you don't really care, and just want "something usable for debugging," then map it to String(describing:)
:
目前尚不清楚你想要的是“Destinos的字符串版本”。如果你真的不在乎,只想要“可用于调试的东西”,那么将它映射到String(描述:):
let listaDeDestinos = listado.map(String.init(describing:))
#1
1
If you wanted the string member variable of each listados object, do:
如果您想要每个listados对象的字符串成员变量,请执行以下操作:
for object in DestinoLista.listados {
ListaDeDestinos.append(object.desDestino)
}
#2
1
It's not clear what you want "the string version of Destinos
" to be. If you don't really care, and just want "something usable for debugging," then map it to String(describing:)
:
目前尚不清楚你想要的是“Destinos的字符串版本”。如果你真的不在乎,只想要“可用于调试的东西”,那么将它映射到String(描述:):
let listaDeDestinos = listado.map(String.init(describing:))