ios - metas - meta tags online
No se puede llamar al valor del tipo de no funciĆ³n ''String'' (6)
Estoy tratando de pasar la variable ILTItem en mi ILTViewController, desencadenada por AppDelegate.swift cuando el usuario inicia mi aplicación a través de un deeplink.
El código con el que tengo errores:
No se puede llamar al valor del tipo de no función ''String''
en la línea donde defino ilt
.
Aquí está el código que tengo en este momento:
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
var ilt = ILT(homeworkID: 1234, title: "History ILT", subject: "History", teacher: "Miss A Smith", teacherCode: "asmith", studentID: 12345, description: "Description....", due: 1450137600, status: "In Progress", hasAttachments: true)
var newVC = ILTViewController()
newVC.ILTitem = ilt
appDelegate.window?.addSubview(newVC.view)
¿Por qué podría ser esto? En mi clase ILTViewController tengo:
class ILTViewController: UIViewController {
// accept the incoming ILT struct
var ILTitem: ILT!
IlT Struct Declaration:
struct ILT {
let homeworkID: Int
let title: String
let subject: String
let teacher: String
let teacherCode: String
let studentID: Int
let description: String
let due: Double
let status: String
let hasAttachments: Bool
}
El error le indica que está intentando llamar a una String
lugar de a un método (constructor de la estructura en su caso). Probablemente haya declarado una variable String
llamada ILT
(mayúscula) en otro lugar y es por eso que falla.
Su código publicado funciona bien por lo que el error debe estar en otro lugar en su código.
Entonces tuve un problema con un mensaje de error similar. Estoy escribiendo una estructura para manejar Scalars para mi biblioteca y necesitaba una raíz cuadrada. Error fue
No se puede llamar al valor del tipo sin función ''Vsip.Scalar''
al llamar a sqrt. Se corrigió llamando explícitamente a sqrt como se muestra a continuación. Espero que esto ayude.
public var sqrt: Scalar {
switch self.type {
case .f:
return Scalar(sqrtf(self.realf))
case .d:
let x = Foundation.sqrt(self.reald)
return Scalar(x)
case .cf:
return Scalar(vsip_csqrt_f(self.vsip_cf))
case .cd:
return Scalar(vsip_csqrt_d(self.vsip_cd))
default:
precondition(false, "sqrt not supported for type /(self.type)")
}
}
Al meterme con los diversos tipos de sintaxis de cierre de Swift + autocompletar, a menudo me encuentro en un lío de variables, tipos de devolución y uso de muy pocos o demasiados conjuntos de ()
o {}
Terminé con algo como:
filenames.first(where: { $0 == filename } ) {
}
Que estaba dando el error
No se puede llamar al valor del tipo de no función
La solución fue eliminar el final { }
, que no es correcto en esta forma.
Solo deberían ser filenames.first(where: { $0 == filename } )
Verifique que no haya aplicado incorrectamente un juego de llaves al final de su falta de función, etc., o algún otro error difícil de detectar en su sintaxis de cierre Swift seleccionada actualmente.
let works = ["foo", "bar"].first(where: { ($0 == "foo") } )
let works = ["foo", "bar"].first(where: { (_ in true) } )
vs
// Cannot call value of a non-function type ''String?''
let fails = ["foo", "bar"].first(where: { (true) } )
Debe asegurarse de usar el parámetro ( $0
o _ in
) en la expresión de cierre.
Use _ in
o $0
para descartar o referenciar el parámetro. No se puede mover directamente al cuerpo del cierre y devolver true
o recibirá este error (extremadamente inútil).
Envuelva su declaración de let en por ejemplo:
if let xxx = yyy {
... do something
}
Tuve un problema similar en este código
array.first { $0 == item }
El problema era que $0
no se ajustaban al protocolo Equatable
. En mi caso, se ajustaba a NSObjectProtocol
y la simple comparación de punteros era suficiente, así que NSObjectProtocol
el problema con
array.first { $0 === item }