2014-06-25 4 views
24

Existe-t-il une syntaxe ou une technique équivalente pour la classe Anonyme dans Swift? Juste pour la clarification Classe anonyme dans l'exemple de Java ici - http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.htmlClasse anonyme dans swift

Merci!

+0

Ne ressemble pas à ça. Les classes anonymes sont l'une de mes fonctionnalités Java préférées, donc j'espère que nous les aurons finalement dans Swift. – hpique

+0

@hpique Vrai, ils sont bons en Java mais ils ne sont pas vraiment nécessaires dans les langages qui ont des fermetures et des classes qui peuvent être déclarées dans les méthodes. Tous les modèles d'écouteurs/adaptateurs en Java peuvent être implémentés facilement en utilisant des fermetures, sans classes anonymes. – Sulthan

+0

@Sulthan Certainement, vous pouvez faire beaucoup avec des fermetures et des classes internes. Mais avec l'utilisation intensive des protocoles dans Swift, je pense que les cours anonymes pourraient être très pratiques dans certaines situations. – hpique

Répondre

12

Il n'y a pas de syntaxe équivalente, autant que je sache. En ce qui concerne les techniques équivalentes, théoriquement, vous pourriez utiliser des fermetures et définir des structures et des classes à l'intérieur de celles-ci. Malheureusement, je ne peux pas obtenir cela pour travailler dans un terrain de jeu ou un projet sans le faire s'écraser. Très probablement, ce n'est pas prêt à être utilisé dans la version bêta actuelle.

Quelque chose comme ...

protocol SomeProtocol { 
    func hello() 
} 

let closure :() ->() = { 
    class NotSoAnonymousClass : SomeProtocol { 
     func hello() { 
      println("Hello") 
     } 
    } 
    let object = NotSoAnonymousClass() 
    object.hello() 
} 

... cette erreur génère actuellement:

invalid linkage type for global declaration 
%swift.full_heapmetadata* @_TMdCFIv4Test7closureFT_T_iU_FT_T_L_19NotSoAnonymousClass 
LLVM ERROR: Broken module found, compilation aborted! 
Command /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift failed with exit code 1 
+0

Marqué comme résolu mais peut encore tester sur beta2 – eranh

6

Aucune syntaxe de classe anonyme à Swift. Mais, vous pouvez créer une classe à l'intérieur d'une des méthodes de classe et de classe:

class ViewController: UIViewController { 

    class anonymousSwiftClass { 
     func add(number1:Int, number2:Int) -> Int { 
      return number1+number2; 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     class innerSwiftClass { 
      func sub(number1:Int, number2:Int) -> Int { 
       return number1-number2; 
      } 
     } 

     var inner = innerSwiftClass(); 
     println(inner.sub(2, number2: 3)); 

     var anonymous = anonymousSwiftClass(); 
     println(anonymous.add(2, number2: 3)); 
    } 
} 
+0

Swift est parfois si bizarre. D'une part, il vous oblige à placer des accolades autour des instructions 'if' sur une ligne et à rendre les instructions switch exhaustives, tout en vous permettant de définir une classe entière dans le * corps * d'une méthode. smh – devios1

8

Par exemple, Java auditeur/motif adaptateur serait traduit à Swift comme ceci:

protocol EventListener { 
    func handleEvent(event: Int) ->() 
} 

class Adapter : EventListener { 
    func handleEvent(event: Int) ->() { 
    } 
} 

var instance: EventListener = { 
    class NotSoAnonymous : Adapter { 
     override func handleEvent(event: Int) { 
      println("Event: \(event)") 
     } 
    } 

    return NotSoAnonymous() 
}() 

instance.handleEvent(10) 

(Crashing le compilateur sur Beta 2)

Le problème est que vous devez toujours spécifier un nom. Je ne pense pas qu'Apple introduira jamais des classes anonymes (et des structures, etc.) car il serait très difficile de trouver une syntaxe qui ne soit pas en conflit avec les fermetures.

Également dans la programmation des choses anonymes sont mauvaises. Nommer des choses aide les lecteurs à comprendre le code.

+0

Je suis d'accord que la programmation anonyme est mauvaise. J'en ai besoin pour des tests mock.Étant donné qu'il n'y a pas de bon cadre de moquerie en ce moment, il est trop difficile de sous-classer chaque faux. – eranh

8

Vous pouvez également créer une classe vide de base qui agit comme un protocole nu, et passer une fermeture à la fonction init qui l'emporte sur tout ce que vous voulez, comme ceci:

class EmptyClass { 

    var someFunc:() ->() = { } 

    init(overrides: EmptyClass -> EmptyClass) { 
     overrides(self) 
    } 
} 

// Now you initialize 'EmptyClass' with a closure that sets 
// whatever variable properties you want to override: 

let workingClass = EmptyClass { ec in 
    ec.someFunc = { println("It worked!") } 
    return ec 
} 

workingClass.someFunc() // Outputs: "It worked!" 

Il est techniquement « anonyme » mais cela fonctionne de la même manière. On vous donne un shell vide d'une classe, puis vous le remplissez ou remplacez les paramètres que vous voulez quand vous l'initialisez avec une fermeture. Il est fondamentalement identique, sauf qu'au lieu de répondre aux attentes d'un protocole, il remplace les propriétés d'une classe.

+0

Brillant. Merci. –