J'essaie de transmettre la variable ILTItem à mon ILTViewController, déclenchée par AppDelegate.Swift lorsque l'utilisateur lance mon application via un lien profond.
Le code que j'ai des erreurs avec:
Impossible d'appeler la valeur du type non-fonction 'String'
sur la ligne où je définis ilt
.
Voici le code que j'ai pour le moment:
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)
Pourquoi cela pourrait-il être? Dans ma classe ILTViewController, j'ai:
class ILTViewController: UIViewController {
// accept the incoming ILT struct
var ILTitem: ILT!
Déclaration IlT Struct:
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
}
L'erreur vous dit que vous essayez d'appeler un String
au lieu d'une méthode (constructeur struct dans votre cas). Vous avez probablement déclaré une variable String
nommée ILT
(majuscule) ailleurs et c'est pourquoi elle échoue.
Votre code posté fonctionne bien donc l'erreur doit être ailleurs dans votre code.
Travaux:
let works = ["foo", "bar"].first(where: { ($0 == "foo") } )
let works = ["foo", "bar"].first(where: { (_ in true) } )
Échoue:
let fails = ["foo", "bar"].first(where: { (true) } )
// Cannot call value of a non-function type 'String?'
Vous devez être sûr de tilisez le paramètre ($0
ou _ in
) dans l'expression de fermeture.
Utilisation _ in
ou $0
pour ignorer ou référencer le paramètre. Vous ne pouvez pas simplement déplacer directement dans le corps de la fermeture et retourner true
ou vous recevrez cette erreur (extrêmement inutile).
Avait un problème similaire dans ce code
array.first { $0 == item }
Le problème était avec $0
non conforme au protocole Equatable
. Dans mon cas, il était conforme à NSObjectProtocol
et une simple comparaison de pointeur suffisait. J'ai donc résolu le problème avec
array.first { $0 === item }
Enveloppez votre déclaration dans si par exemple:
if let xxx = yyy {
... do something
}
En jouant avec les divers types de syntaxe de fermeture de Swift + autocomplete, je me retrouve souvent dans un fouillis de variables, de types de retour et d'utilisation d'un nombre trop petit ou trop important de jeux de ()
Ou {}
J'ai fini avec quelque chose comme:
filenames.first(where: { $0 == filename } ) {
}
Ce qui donnait l'erreur
Impossible d'appeler une valeur de type non-fonction
La solution consistait à supprimer le { }
Final, ce qui est incorrect dans ce formulaire.
Devrait juste être filenames.first(where: { $0 == filename } )
Vérifiez que vous n'avez pas appliqué correctement un ensemble d'accolades à la fin de votre non-fonction, etc., ou une autre erreur difficile à repérer dans la syntaxe de fermeture actuelle Swift).
J'ai donc eu un problème avec un message d'erreur similaire. J'écris une structure pour gérer les scalaires de ma bibliothèque et j'avais besoin d'une racine carrée. L'erreur était
Impossible d'appeler la valeur du type non-fonction 'Vsip.Scalar'
lorsque vous appelez sqrt. Corrigé en appelant explicitement sqrt comme indiqué ci-dessous. J'espère que cela t'aides.
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)")
}
}