###### tags: `Work On Note`
# Object-C Migrate to Swift
> **Wranning**:There is nothing, just a shitpost.
**At my new job, We are refactoring in full swing.**
- Migrate to Swift
- MVC to MVVM
- Reactive programming (RxSwift)
**In a completed Application.**
### My nonsense journal
``(It will be fun and not big deal)`` what I think, when I get the offer and the task for me.
After two weeks, I has refactored one view controller and refactoring another one, ``(It's really fun, but hard)``, I must stress this.
#### The Point to Solve
- Lots of delegate parttern of multi components.
1. Refactor it
2. Build a middleware
3. Or just leave it alone.
- Lots of reference containers those are not suitable migrated to reactive programming in full applection.
1. Refactor it
2. Build a middleware
3. Or just leave it alone.
- 3th AD SDK (We haven't figured out a solution yet)
1. Just leave it alone.
- bla bla bla bla...
1. Refactor it
2. Build a middleware
3. Or just leave it alone.
There are many beautiful design of components in Object-c. As you see, those wheels we must to consider to refactor. But the more important are time required and scope of impact. And....the PM.
---
### What I do
```objectivec=
// Before: object-c
typedef void (^SomeCallback)(BOOL success, NSError *_Nullable error, NSArray *_Nullable whatever))
- (void)getSomeList:(nonnull SomeToken *)token
callback:(nullable SomeCallback) callback;
// Swift
// first middleware
struct FirstMiddleware: ApiMiddleware {
func getSomeList(token: SomeToken, completion: @escaping Result<whatever, Error> {...}
}
// Swift
// second middleware for reactive
struct SecondMiddleware: ObserableMiddleware {
func getSomeList(token: SomeToken)-> Obserable<whaterer> {...}
}
```
### delegate
```objectivec=
// Before: object-c
@protocol WhateverDelegate <NSObject>
- (void) foo:(SomeToken * _Nullable)token refreshToken:(NSString *_Nullable)refreshToken error:(NSError *_Nullable)error;
@end
@interface WhateverObject () <WhateverDelegate>
// create delegate middleware
class WhateverDelegateProxy: NSObject, ObservableType, WhateverDelegate {
typealias E = Event
private let publish: PublishRelay<FooResult> = .init()
func subscribe<O>(_ observer: O) -> Disposable where O: ObserverType, E == O.E {
subject.bind(to: observer)
}
func foo(_ token: SomeToken?, refreshToken: String?, error: Error?) {
publish.accept(FooResult(...))}
}
// migrate swift
class WhateverObjectSwift {
func bind() {
let proxy = WhateverDelegateProxy()
model.delegate = proxy
proxy.bind(to:...).disposed(by: bag)
}
}
```