Reactivecocoa: Comment devons-nous gérer les préfixes `rac_` dans Swift 3 ?

Créé le 10 juil. 2016  ·  15Commentaires  ·  Source: ReactiveCocoa/ReactiveCocoa

Les directives de l'API Swift définissent une convention de cas de chameau inférieurs.

Actuellement, nous avons deux exceptions dans la base de code Swift : NotificationCenter.rac_notifications(forName:object:) et URLSession.rac_data(with:) . De plus, étant donné que l'IIRC va fusionner Rex dans le cadre du référentiel Cocoa Bindings à un moment donné, la façon dont les préfixes rex_ sont gérés doit également être prise en compte.

Doit-on les suivre ou les laisser tels quels ?

Pour les deux extensions de ce référentiel, le nom le moins créatif est probablement makeProducer .

Commencez les noms des méthodes d'usine par "make", egxmakeIterator().

Edit : Après une seconde réflexion, pour les producteurs, ils n'ont aucun effet secondaire appliqué jusqu'à ce qu'ils soient démarrés. Ainsi, un nom non mutant décrivant ce qu'il fournirait serait approprié pour l'OMI, par exemple seulement notifications(forName:object:) .

Commentaire le plus utile

L'une des choses que nous avons faites avec SnapKit est de créer une structure qui héberge les extensions, les API RAC pourraient être stockées comme :

struct UIButtonRACDSL {
    var pressed: Signal<UIButton, NoError>
    init(button: UIButton) { }
}

extension UIButton {
    var rac: UIButtonRACDSL { return UIButtonRACDSL(button: self) }
}

Suivre cette voie offre une certaine flexibilité et réduit la portée de collision des extensions.

Tous les 15 commentaires

Nous pourrions supprimer les préfixes puisque les types rendent les noms sans ambiguïté, du moins dans la plupart des cas. Ou nous pourrions les garder. Je suis sur la clôture.

Si nous les conservons, nous devrions utiliser rac_ ici (y compris le code de Rex) et trouver un nouveau préfixe pour ReactiveSwift.

Étant donné que la suppression du préfixe des liaisons provoquerait des collisions de noms avec les propriétés stockées, une alternative serait d'introduire un proxy qui les hébergerait toutes.

par exemple

view.bindables.text <~ property

// `view.bindables` is of type `Bindings<UIView>`, which conforms to `BindingsProtocol`
// that requires an associated type `Owner`.
//
// `view.bindables.text` is provided by the extension to `BindingsProtocol` for all
//`Owner` inherited from `UIView`.

(Ou juste rac ? Mais ReactiveSwift et ReactiveCocoa pourraient exposer une sorte de liaisons, je suppose)

... Ou nommez-le simplement view.textProxy , view.reactiveText ou autre, hein.

Edit : j'ai mis en place un prototype rapide (https://github.com/RACCommunity/Rex/pull/143).

Edit 2: Nettoyez un peu le désordre. :p

ReactiveCocoa 5+ n'a pas besoin d'être compatible avec Rex. RAC englobera Rex.

Bien sûr, je voulais juste dire ces liaisons apportées par Rex. Désolé si ça se lit comme un gâchis. ??

outlets serait aussi un concurrent.

"réactif" est mieux avec un langage rapide. "rac_" et "rex_" sont de très mauvais noms. Je choisirai "réactif", "actif" ou "signal" afin que nous puissions avoir view.reactiveText ou view.activeText ou view.signalText

Avec Swift et ses modules, il n'y a plus de risque de collisions d'exécution, et donc plus besoin de préfixes. Alors laissons-les tomber ! :RÉ

C'est bien pour les méthodes. Mais nous devons encore chercher une approche pour les propriétés, car les propriétés ne peuvent pas être surchargées. ??

Construit sur un proxy bindable par exemple view.bindables.something , nous pouvons introduire des raccourcis comme %view.something . ??

Je pense qu'il est prudent de tirer la conclusion que nous ne pouvons en aucun cas éviter / lever l'ambiguïté des collisions au moment de la compilation, du moins dans Swift 3.0. Des suggestions telles que l'utilisation d'opérateurs ou de propriétés magiques limitent simplement le potentiel de collision à une entité.

Je risquerais une collision avec un opérateur en échange d'une plus belle sténographie cependant...

Je pense que nous sommes coincés avec des préfixes pour les propriétés pour le moment.

L'une des choses que nous avons faites avec SnapKit est de créer une structure qui héberge les extensions, les API RAC pourraient être stockées comme :

struct UIButtonRACDSL {
    var pressed: Signal<UIButton, NoError>
    init(button: UIButton) { }
}

extension UIButton {
    var rac: UIButtonRACDSL { return UIButtonRACDSL(button: self) }
}

Suivre cette voie offre une certaine flexibilité et réduit la portée de collision des extensions.

Oui, je l'ai déjà évoqué avec une version basée sur un protocole. Il remplace le trait de soulignement par un point et permet l'introduction d'un raccourci opérateur. L'OMI utiliserait rac comme nom de propriété, car ce n'est pas une abréviation très courante de toute façon.

https://github.com/RACCommunity/Rex/pull/143

rac propriété aurait l'air tellement plus propre… TELLEMENT MUUUCH !!! :heart_eyes:

Je pense que nous devrions voler l'approche adoptée par RxSwift.

https://github.com/ReactiveX/RxSwift/blob/4952adb27c684b47792923b00015516849061eab/RxCocoa/Common/Reactive.swift
https://github.com/ReactiveX/RxSwift/blob/4952adb27c684b47792923b00015516849061eab/RxCocoa/iOS/UIControl%2BRx.swift

Ils ont ajouté une structure, Reactive qui est générique sur le type qu'ils souhaitent étendre. Ils ont ensuite ajouté des méthodes sur les extensions contraintes à Reactive . De toute évidence, ils ont modélisé cela d'après le .lazy Swift.

Cette page vous a été utile?
0 / 5 - 0 notes