2017-09-29 9 views
-1

Je dois obtenir la classe comme réponse après le changement de casse dans swift, j'ai des problèmes de compilation avec cette fonction.besoin d'obtenir une classe après le commutateur cas dans swift?

func getOptClass(signal : String) -> AnyClass{ 

var result = AnyClass 

switch(signal){ 
    case "IntRR": 
     result = BPMClass.self 
     break 

    case "BPM": 
     result = BPMClass.self 
     break 

    case "ECG": 
     result = ECGClass.self 
     break 

    default: 
     result = nil 
     break 
} 
return result 
} 

Voici l'erreur:

Swift Compiler Error Group 
/Users/gab/Desktop/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift:68:18: Expected member name or constructor call after type name 
/Users/gab/Desktop/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift:68:18: Use '.self' to reference the type object 
/Users/gab/Desktop/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift:72:22: Cannot assign value of type 'BPMClass.Type' to type 'AnyClass.Protocol' (aka 'AnyObject.Type.Protocol') 
/Users/gab/Desktop/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift:76:22: Cannot assign value of type 'BPMClass.Type' to type 'AnyClass.Protocol' (aka 'AnyObject.Type.Protocol') 
/Users/gab/Desktop/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift:80:22: Cannot assign value of type 'ECGClass.Type' to type 'AnyClass.Protocol' (aka 'AnyObject.Type.Protocol') 
/Users/gab/Desktop/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift:84:22: Nil cannot be assigned to type 'AnyClass.Protocol' (aka 'AnyObject.Type.Protocol') 
/Users/gab/Desktop/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift:87:12: Cannot convert return expression of type 'AnyClass.Protocol' (aka 'AnyObject.Type.Protocol') to return type 'AnyClass' (aka 'AnyObject.Type') 
+1

Pouvez-vous inclure l'erreur que vous obtenez? Les gens seront en mesure d'aider beaucoup plus si vous avez cette information. –

Répondre

2

Dans votre cas, je probablement une fonction renvoyant un type générique représentant votre classe. Vous pouvez essayer quelque chose comme ceci:

func getOptClass<T>(signal : String) -> T { 
switch(signal) { 
    case "IntRR", "BPM": 
     return T as! BPMClass 
    case "ECG": 
     return T as! ECGClass 
    default: 
     return nil 
    } 
} 

Ici, le T représente tout type de sorte que toute la classe que vous créez. Dans chaque cas de commutation, je lance ce type par votre classe correspondante. Vous n'avez pas besoin de mettre des instructions break comme dans JAVA seulement si vous voulez gérer des cas particuliers. Je simplifie également votre commutateur et je pense que cela devrait fonctionner.

+0

Merci pour la réponse, mais j'ai toujours ces erreurs, lors de la compilation: '/Users/gab/Desktop/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift:70:20: Impossible de convertir l'expression de retour de type 'BPMClass.Type' à return type 'T' /Users/gab/Desktop/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift:73:20: Impossible de convertir l'expression de retour de type 'ECGClass.Type' pour renvoyer le type 'T' /Users/gab/Bureau/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift: 76: 20: Nil est incompatible avec le type de retour 'T' –

+0

Pouvez-vous poster le code de votre classe BPMClass et autres? – Arrabidas92

1

Vous devez déclarer résultat comme AnyClass, pas encore défini sa valeur que:

var result: AnyClass! 

puis ajoutez votre instruction switch. Vous n'avez pas besoin des pauses; ils ne sont pas nécessaires dans Swift; le démarrage d'une nouvelle déclaration de cas va casser le précédent, sauf si vous ajoutez tomber à travers.

De même, vous devriez retourner AnyClass ?, puisque vous avez une option nulle.

+0

J'ai déjà essayé, j'ai une erreur: /Users/gab/Desktop/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift:82:18: Nom de membre attendu ou appel de constructeur après le nom de type /Users/gab/Desktop/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift: 82: 26: Ajouter des arguments après le type pour construire une valeur du type /Users/gab/Desktop/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift:82:26: Utiliser ' .self 'pour référencer l'objet type –

0
func getOptClass(signal : String) -> AnyClass? { 
    var result: AnyClass? 

    switch(signal) { 
    case "IntRR", "BPM": 
     result = BPMClass.self 
    case "ECG": 
     result = ECGClass.self 
    default: 
     result = nil 
    } 

    return result 
} 

Notez que le type de retour est maintenant facultatif. C'est la seule façon de vous permettre de revenir à zéro.