web-dev-qa-db-fra.com

Impossible d'appeler la valeur du type non-fonction 'String'

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
}
21
James

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.

21
redent84

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).

3
pkamb

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 }
2
Tim

Enveloppez votre déclaration dans si par exemple:

if let xxx = yyy {
   ... do something
}
2
Vlad

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).

1
pkamb

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)")
        }
    }
1
JVSIP