Nous avions deux plates-formes, 1000000 roubles de prix en argent, 6 prix, 26000 lignes de code à lire et à évaluer, ainsi que 20 pages de commentaires, plusieurs critères d'évaluation, une boîte Badweiser, une pinte d'éther pur et 12 bulles de sédatif ... Non pas que tout cela était absolument nécessaire pour organiser un concours de développeurs, mais si vous avez déjà commencé à évaluer des solutions, vous devez aborder la question sérieusement.
Nous résumons les résultats du concours Mobile Challenge Wallet et analysons en détail les décisions des participants.
La tâche
Essayez de capturer la sensation d'un portefeuille physique dans l'application Wallet et réinventez deux écrans: l'écran principal avec une liste de cartes et un écran avec les détails de la carte.
Suggérer une implémentation technique de ces écrans et la transition entre eux. La logique d'affichage, le tri de la liste des cartes, UI / UX, animations et toutes les autres nuances sont à vous.
1
2 (iOS Android)
1 000 000
100 -
1
13
11
6
iOS
1 (250 000 ) —
2 (150 000 ) —
3 (100 000 ) —
Android
1 (250 000 ) —
2 (150 000 ) —
3 (100 000 ) —
, — .
:
.
, .
.
.
:
iOS- Android-, -.
Android: 23+ API.
iOS: iOS 11+.
iOS
, Swift, . 11, . -, , , API. Xcode , SDK .
DI (Dependency Inversion)
, , .
SR (Single Responsibility)
: , , , . / .
, . iOS- — MyClassName MyClassNameProtocol.
, ( -). , ( ), .
reference value ,
:
class RequestModel: Request {
var method: HTTPMethod = .get
var headers: [String : String]? = nil
var url: URL = URL(string: "https://textures.cardsmobile.ru")!
var parameters: [String : String]? = nil
var contentType: ContentTypeRequestEnum = .applicationURLEncoder
}
struct, class, .
3rd party
, Alamofire . . , Alamofire , AF.request(url).response { … } . URLSession.shared.dataTask(with: url) { … }.resume()? , . , . , — « URLSession ». , .
Core Data
(NSManagedObjectContext) save() . NSManagedObjectContextDidSave background view . , .
DispatchQueue.global
- , , async ( ), - , , .
background Quality Of Service (QoS)
background , ( , , , ). QoS utility. .
— .
, . , — Image Resizing Techniques .
UIViewController
— , . viewWillAppear viewWillDisappear ( , ). , , . , App Store .
UIApplicationDidEnterBackgroundNotification UIApplicationDidBecomeActiveNotification, , .
UI . , Safe Area.
, . , - , « » , . ( ), Xcode Edit > Format > Spelling and Grammar > Check Spelling While Typing.
, , , UI. Xcode Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want.
(warnings)
(swiftlint, , deprecated ..), ..
: . :)
— , , . .
: self.viewModel.objects().count%5 — , - .
, « ». «. » .
-, , . , View, Interactor, Model Builder .
— DI (Dependency Injection).
Dependency Container, .
Kingfisher , ImageLoader. 3rd party .
final ,
- . final . Whole Module Optimization final. , , , final . .
#1 ,
#2 , ,
-
, -, , -, , UI.
Apple Dark Mode, , .
— .
#1
#2
Android-
Kotlin, API 23+ .
. UI. drag&drop.
DI (Dependency Inversion), Singleton
CardsInteractor domain- CardsRepository data-, SOLID. Interface CardsRepository, Domain-.
. : « » github.
, .
Clean Architecture: data, domain, presentation
CardsInteractor Storage . . , CardsInteractor Repository DataSource. CardsViewModelImpl , , , .
-, CharSequence?.isNotNullAndEmpty, List<T>.isEmpty
, — . , , - Kotlin CharSequence?.isNullOrEmpty(), isEmpty() ..
view info1TitleTextView, info2TitleTextView, info3TitleTextView, info4TitleTextView. , view. .
deprecated
window.decorView.systemUiVisibility, View.SYSTEMUIFLAGLAYOUTFULLSCREEN, SYSTEMUIFLAGLAYOUTHIDE_NAVIGATION. deprecated , .
Clean Architecture
, , , , . .
«» .
, :)
#1
#2 «3» ,
#3
: , , , , , , , , , , .
! .
- Cardsmobile | Engineering, , iOS Android, QA backend. , .