Este repositório foi criado para fins de demonstração e não para consumo. No entanto, dado o feedback e o uso deste repositório, começarei a mantê-lo aqui e priorizar a fixação/implementação de questões elevadas.
Mvvm ? Por que não MVC que a Apple recomenda? Android MVP é ótimo, certo? Que tal o padrão legal de Viper ? Acredito que grandes esforços já foram colocados para explicar o que cada padrão traz para a tabela e, portanto, a idéia aqui não é adicionar ao debate, mas apenas se basear em cima da opinião que já formei: a MVVM é o caminho a percorrer.
Como um primer rápido para o que é o MVVM, é um padrão de design pelo qual o ViewModel medeia entre um modelo de fornecimento de dados e exibição que exibe os dados fornecidos como mostrados abaixo:

No iOS, o View é essencialmente um ViewController e o ViewModel é um objeto (uma estrutura) que fornece dados exatos para a visualização renderizar.
Isso fornece uma arquitetura vagamente acoplada, que é sustentável (controladores de visão muito fina) e testável (o ViewModel Abstracts Out a UI e, portanto, é facilmente testável)
Ainda há uma ressalva: o MVVM clássico permite o princípio de responsabilidade única facilmente (e lindamente) no caso de modelos como modelos de domínio. No entanto, no caso de modelos anêmicos (que geralmente é o caso quando você tem APIs de repouso bem escrito), também precisaria de outro mediador ou apresentador que facilite o fluxo de dados e navegação.
Agora, o View Model tem responsabilidade de atualizar a visualização e obter atualizações da visualização sobre as alterações feitas pelo usuário. Isso pode ser alcançado pelo código mínimo usando a ligação de dados bidirecionais. Mas ... o iOS não tem mecanismo de ligação de duas maneiras disponíveis para fora da caixa!
Felizmente, temos bibliotecas reativas como RxSwift, RxCocoa, mas elas são pesadas demais, considerando que a ligação bidirecional é uma parte muito pequena do paradigma de programação reativa. O SimpleTwowaybinding se esforça para fornecer apenas vinculação de duas maneiras, de uma maneira simples e despretensiosa!
Para executar o projeto de exemplo, clone o repo e execute pod install no diretório Exemplo primeiro.
import SimpleTwoWayBinding
struct FormViewModel {
let name : Observable < String > = Observable ( )
let companyName : Observable < String > = Observable ( )
let yearsOfExperience : Observable < Double > = Observable ( )
let isCurrentEmployer : Observable < Bool > = Observable ( false )
let approxSalary : Observable < Float > = Observable ( )
let comments : Observable < String > = Observable ( )
}As propriedades que você deseja ser "vinculável" à visão devem ser declaradas como observáveis.
class ViewController : UIViewController {
@ IBOutlet weak var nameField : UITextField !
@ IBOutlet weak var companyField : UITextField !
@ IBOutlet weak var isCurrentEmployerSwitch : UISwitch !
@ IBOutlet weak var yearsOfExperienceStepper : UIStepper !
@ IBOutlet weak var salaryRangeSlider : UISlider !
@ IBOutlet weak var selectedSalaryRangeLabel : UILabel !
@ IBOutlet weak var selectedYearsOfExperienceLabel : UILabel !
var viewModel : FormViewModel !
override func viewWillAppear ( _ animated : Bool ) {
super . viewWillAppear ( animated )
self . navigationItem . title = " Survey Form "
setupBindings ( )
}
func setupBindings ( ) {
nameField . bind ( with : viewModel . name )
companyField . bind ( with : viewModel . companyName )
isCurrentEmployerSwitch . bind ( with : viewModel . isCurrentEmployer )
yearsOfExperienceStepper . bind ( with : viewModel . yearsOfExperience )
salaryRangeSlider . bind ( with : viewModel . approxSalary )
selectedSalaryRangeLabel . observe ( for : viewModel . approxSalary ) {
[ unowned self ] ( _ ) in
self . selectedSalaryRangeLabel . text =
self . viewModel . getSalaryString ( )
}
selectedYearsOfExperienceLabel . observe ( for : viewModel . yearsOfExperience ) {
[ unowned self ] ( _ ) in
self . selectedYearsOfExperienceLabel . text =
self . viewModel . getExperienceString ( )
}
}
} O método bind no uicontrol orquestra a ligação de duas maneiras com o observável. Isso é tudo o que é necessário para que o formulário funcione. Veja abaixo a captura de tela.
SimpleTwowaybinding está disponível através de Cocoapods. Para instalá -lo, basta adicionar a seguinte linha ao seu PODFILE:
pod 'SimpleTwoWayBinding' Manish Katoch, [email protected]
O SimpleTwowayBinding está disponível sob a licença do MIT. Consulte o arquivo de licença para obter mais informações.