2016-01-27 33 views
13

Sto provando a passare la variabile ILTItem nel mio ILTViewController, attivato da AppDelegate.swift quando l'utente avvia la mia app tramite un collegamento diretto.Impossibile chiamare il valore di tipo non-funzione 'String'

Il codice che ho errori con:

Non è possibile chiamare il valore della non-funzione di tipo 'String'

sulla linea in cui mi definisco ilt.

Ecco il codice che ho in questo 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) 

Perché potrebbe essere? Nella mia classe ILTViewController ho:

class ILTViewController: UIViewController { 
    // accept the incoming ILT struct 
    var ILTitem: ILT! 

ILT Dichiarazione 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 
} 
+0

Inserisci 'dichiarazione di classe ILT' – redent84

+0

@ redent84 ho aggiunto – James

+3

Il tuo codice funziona bene: http: // swiftstub.com/580271845. Probabilmente hai dichiarato una variabile 'String' chiamata' ILT' da qualche altra parte ed è per questo che fallisce. – redent84

risposta

14

L'errore che si sta dicendo che si sta tentando di chiamare una String invece di un metodo (struct costruttore nel tuo caso). Probabilmente hai dichiarato una variabile denominata ILT (lettere maiuscole) da un'altra parte ed è per questo che fallisce.

Il codice inviato works fine quindi l'errore deve essere da qualche altra parte nel codice.

+0

Grazie. Problema correlato ma leggermente separato alla domanda: la mia classe 'ILTViewController: UIViewController' non riceve la nuova variabile -' print'ing 'ILTItem.title' restituisce null. Qualche idea del perché? – James

+2

Ti consiglio di aprire una nuova domanda con il codice pertinente e preferibilmente un progetto di esempio autonomo che riproduca il problema. – redent84

0

Avvolgete il vostro istruzione let in se, ad esempio:

if let xxx = yyy { 
    ... do something 
} 
0

così ho avuto un problema con un messaggio di errore simile. Sto scrivendo una struttura per gestire gli scalari per la mia libreria e avevo bisogno di una radice quadrata. errore era

Impossibile chiamare valore di tipo non-funzione 'Vsip.Scalar'

al momento della chiamata sqrt. Risolto il problema chiamando esplicitamente sqrt come mostrato sotto. Spero che questo ti aiuti.

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)") 
     } 
    } 
0

In fare in giro con vari tipi di sintassi chiusura di Swift + autocomplete spesso mi trovo in un pasticcio di variabili, tipi restituiti, e l'utilizzo di troppo pochi o troppo molti set di () o {}

ho finito con qualcosa di simile:

filenames.first(where: { $0 == filename }) { 

} 

che stava dando l'errore

non può chiamare valore di tipo non-funzione

soluzione era di rimuovere il trascinamento { }, che non è corretto in questa forma.

dovrebbe essere solo filenames.first(where: { $0 == filename })

Controllare che non si è erroneamente applicato una serie di parentesi graffe per la fine del tuo non-funzione, ecc, o qualche altro difficile da individuare errore nella sintassi chiusura Swift scelta corrente.

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

Devi essere sicuri di utilizzare il parametro ($0 o _ in) nell'espressione di chiusura.

Utilizzare _ in o $0 per scartare o fare riferimento al parametro. Non è possibile spostarsi semplicemente direttamente nel corpo di chiusura e restituire true o si riceverà questo errore (estremamente inutile).

1

avuto un problema simile a questo codice

array.first { $0 == item } 

Il problema era con $0 non conformi alla Equatable protocollo. Nel mio caso è conforme alla NSObjectProtocol e semplice confronto puntatore è stato sufficiente, così ho risolto il problema con

array.first { $0 === item }