목록Objective-C [레거시 뿌수기!] (17)
광어네 맛집
원래 이 오류의 경우 xib, 스토리보드 아웃렛이 제대로 연결되지 않았을 때 주로 발생한다 " setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key " 근데 이번 케이스에서는 따로 Xib 만들지도 연결하지 않았는데 이런 오류가 떴다 처음에는 단순히 초기화를 잘못한 줄 알고 찾았으나 bgView가 걸려서 검색을 해보니 Class 자체 이름이 비슷해서 에러가 난 거였다... 4시간 정도 날림 ㅎㅎ... 오늘은 개발 조금 쉬어야겠다 예를 들어 내 케이스는 Swift 로 CustomView를 만들어 Objective C로 가져가 사용하려고 했다 왜냐면 기존에 만들어져있는 CustomView가 너무 지져분했기 때문에..
Swift로 코딩을 한 뒤 Objective C에 적용시키려니 다음과 같은 에러가 떴다 'Method Cannot be in an @objc extension of a class (without @nonobjc) because the type of the parameter cannot be represented in Objective-C' 원인은 간단한데 Objective C 에서는 맞지 않다는 거 그럼 에러가 난 부분은 다양할 수 있으나 저 같은 경우에는 enum 처리할 때 에러가 났음 기존 코드 enum Style { case a, b } 바꾼 코드 @objc enum Style: Int { case a, b } 오늘은 간단하게 해결!
지금 잘못되어 있는 로직 변경이랑 회사 이슈 때문에 요즘 글 쓸 시간도 없는 ㅠㅠ 무튼 이번 포스팅은 Objective C 레거씨 코드 뿌시기! 상황 : BaseViewController를 모든 ViewController 가 상속받고 BaseViewController 안에는 화면 이동 메서드를 넣어두고 이동할 때마다 사용함 -> 리펙토링 : Transfer + Utils 를 추가하여 Class method로 리펙토링 BaseViewController 를 상속받아 사용하는 게 나쁜게 아니지만 해당 프로젝트에서는 중복코드도 많고, 쓰지 않는 BaseViewController 메서드를 굳이 받아야하나? 라고 항상 의문이 생겼었다! 대충 이전 개발자 분의 의도는 알겠으나 Static Method 로 만들면 훨씬..
ObjectiveC와 Swift를 같이 사용하기 위해서는 별도의 작업이 필요한것도 있지만 조금만 바꿔주면 되는 것들도 있다 그 중에 하나가 Enum 타입이다 Objective C에서만 사용할 경우 typedef enum { CaseA, CaseB, CaseC, CaseD } ServiceCase; 만약 Swift에서도 사용하고 싶다면 다음과 같이 선언해주면 된다 typedef NS_ENUM(NSUIntegrt, ServiceCase) { CaseA = 0, CaseB, CaseC, CaseD }; 기본적으로 enum type의 경우 0 이 시작점이 대부분인데 레거시 코드를 보는 입장에서는 무작정 바꾸면 안된다 여러 사람들이 만진 코드라서 하드 코딩이 되어 있을 수 있기 때문에 기존에 짜여진 코드를 확인한..
Objective C 로 되어 있는 프로젝트는 Swift를 사용하기 위해서는 'PROJECTNAME-Bridging-Header.h' 을 통해서 상호호환 할 수 있습니다. 헤더 파일만 있다고 다 구현할 수 있는 건 아님! 예를 들어 Objective C 는 Swift 구조체를 사용할 수 없고, Enum 열거형도 사용할 수 없습니다 그렇지만 데이터를 따로 보내거나 각 언어에서 로직을 만든 다음에 보내어 사용할 수는 있습니다! 전제: 지금 다루고 있는 프로젝트 기준으로 말씀드리면 Objective C의 경우 디코딩을 하여 모델화하여 사용하고자 번거로운 작업을 해야했어요 For 반복문을 통해서 NSDictionary에 담아준 뒤 사용ㅎ... 그리고 모델처럼 사용할 수 있었음 Swift는 Codable 프로토콜..
이번 포스팅은 Swift로 된 라이브러를 Objective C에서는 어떻게 사용하는지 알아보도록 합니다! 기본적으로 SPM, Pods, 카르타고 등 다양한 경로로 설치할 수 있습니다 설치가 된다면 사용하는 방법은 너무 쉽게 되기 때문에 중간중간 내용은 생략하고 넘어갈게요 우선 Pods로 설치할 경우 Pods > Products > framework 파일이 자동으로 생성됩니다! Objective C로 만들어진 파일일 때는 문제없이 import를 해줘서 사용하면 되지만 Swift로 만들어진 파일을 사용하려면 조금 다른? import 방법이 필요합니다! 예시로 기존에 import를 하려고 했으면 아래처럼 header file만 설정해줬으면 #import "Library.h" Swift file의 경우 head..
Swift UI가 ObjectiveC처럼 먼저 선언해주고 사용해서 느낌이 비슷한거 같기도 하고 아닌거 같기도 하고 아무튼 오늘은 Dictionary를 다뤄볼까 함! 바로 간단히 본론! // 방법 1 NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys: @"value", @"key", nil]; // 방법 2 NSDictionary *dictionary = @{@"key", @"value"}; 내가 실수 했던게 원래 Key Value이렇게 통일되어 있는게 아니였음 //값 저장 [dictionary setOnject: value forKey: key]; //값 가져오기 NSString *name = [dictionary objectiF..
이제 날씨도 더워지고 봄은 어디갔나 ㅜㅜ 오늘은 self와 _를 비교하고자 함! 바로 알아봅시다! 'self' 는 setter & getter 속성을 통해 액세스함! '_'는 직접 액세스 함! ( 즉, setter & getter를 거치지 않음 ) 이걸 몰랐을 때는 둘 다 같은 개념인줄; 다음 예시를 봅시다 다음과 같이 헤더 파일을 설정해주고 메인 파일에서는 받은 값을 setter를 통해서 입력해줍니다! //Header file @property (nonatomic, strong) NSString *tesNaming; //Main file - (void)setTestNaming:(NSString *)testNaming { self.testNaming = testNaming; } 여기까지는 문제 없음! 근..
요즘 날씨가 오락가락하는데 옷 입기가 애매함 아무튼 요즘은 출시 앱하나 만들까 하는데 Swift로 해야하나 SwiftUI로 해야하나 고민이긴 함 ㅜ 아무튼 이번 포스팅은 UIButton BackgroundColor에 대해서 적어볼까 함! 상황은 UIButton을 CustomButton으로 만들꺼임 참고로 Designable 써서 스토리보드에 보이게 만들거임 먼저 헤더 파일에 아래처럼 선언합니다 #import IB_DESIGNABLE @interface Button: UIButton @property (nonatomic, strong) IBInspectable UIColor *enableBackgroundColor; @property (nonatomic, strong) IBInspectable UIColo..
오늘 포스팅은 define이라는 것을 알아 볼 예정! define이 Swift에서는 typealias 인줄 알았지만? 좀 다른 개념이었음 그럼 define이 뭐죠?? 먼저 Objective C 에서도 마찬가지로 typedef이라는 키워드를 제공해주는데 사용은 다음과 같이 사용합니다! typedef [type] [name]; 예를 들어서 아래처럼 사용할 수 있음! // 선언 typedef NSString 글자; // 사용 글자 *name = @"가나다라"; 이외의 것들은 다른 포스팅에서 알아보고 #define은 매크로 상수라고 선언한 상수를 고대로 전달해주는 거라고 합니다 // 먼저 자동완성은 다음과 같이 나옵니다 #define [macro] 그럼 사용은?? 이렇게 쓸 수 있음! #define RGB(r,..
드디어 목요일이네요 ㅎㅎㅎ 오늘 내일만 버티면 또 주말입니다 이번 포스팅은 Objective - C 반복문에 대해서 알아보도록 하겠습니다 먼저 for 문에 대해서 알아보면 다음과 같습니다! for (int i = 0; i < 10; i++) { i = i + 10; } for (순환 parameter; 조건; 카운트) { // 구현할 내용 작성 } 참고로 Enum에 대해서도 돌 수 있습니다 for (adorable in dog) { NSLog(@"우리 강아지 이름은 %@입니다.",[adorable name]) } // 틀린 부분이 있으면 언제든지 피드백 환영입니다! 다음은 조건에 따른 반복문입니당 조건을 만족할 때 루프에서 빠져나옴! int count = 1; while (true) { // 탈출 조건 ..
이번 포스팅은 AddTarget에 대해서 작성해보자고 함 오늘은 바로 본론으로 넘어가서 Swift에서는 AddTarget하면 어떻게 썼나면 let button = UIButton() button.addTarget(self, action: #selector(testMethod("내 이름")), for: .touchUpInside) @objc func testMethod(_ name: String) { print("\(name) 출력됨") } 진짜 편함! Objective C는 어렵냐? 아님! Objective C 에서는 다른게 그닥 없음 self.button = [UIButton buttonWithType:UIButtonTypeSystem]; [self.button addTarget:self action:..
요즘은 Swift로는 라이브러리 만드는 중 ㅎㅎ.. 라이브러리 만드는 것도 이래저래 안되는 것도 있어서 개발 경험치 오르는 중 ! 아무튼 이번 포스팅은 간단히 Block에 대해서 설명해볼까 함 Swift 에서는 Closure가 여기에 해당하는 듯! Objective C block 너무 복잡복잡 기본 형태는 앞에 반환타입 중간에는 파라메터 ^(캐럿)을 사용하면 된다 처음 코드 봤을 때는 이게 뭔가 했음 솔직히 이게 맞는가 싶기도 함 Block를 작성할 때 ^(캐럿)을 적는데 블록을 표시하는 심볼 같은 거라고 함 이거 찾는다고 조금 헤맸음 Void (^blockName)(void) = ^{ // 내용 작성 } 사용은 아래처럼도 쓰는 거 같았음 - (void) testNaming:(NSString)naming..
후아ㅏㅏ ObjC 에 대해서 적을 내용이 참 많네.. 이번 포스팅은 특별한 건 아니고 내가 생각하고 있던 거랑 다른 분의 의견을 종합해서 적어보고자 한다! 오래된 회사에서 코드를 뜯어보면 레거시 코드가 많이 있다 그런 코드를 보면 이건 왜 그렇게 쓰는지 이해가 안되는 것들이 많이 있을 거임 안 그렇다고? 하면 회사가 크거나 스타트업이거나 리펙토링 했겠죠?ㅋㅋㅋㅋㅋ라고 믿고 싶어요 ㅜ 이거 누가 작성했어!! - 코드를 보니 View 구성이 특정View를 전부 상속받아서 작성되어 있었음 내 생각: 상속을 하는 건 OK, 근데 쓰지도 않을 객체를 만들어 놓고 모든 ViewController에 상속 시켜놓으면 앱이 무거워지지 않을까 함 그래서 뜯어 고치고 싶은데용? 다른 분 생각: 대부분 1인 개발자가 많아서 ..
Swift만 1년 6개월을 봤기 때문에 다른 언어에 대한 궁금증 반? 살짝 부담감 반? 이 있었는데 옵씨를 하게되다니 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ Objective - C를 공부하면 좋은 점이 레거시 코드를 볼 수 있다! (보면서 이건 왜 이렇게 짰을까...라는 생각은 덤) Objective - C에 익숙해지면 조금씩 Swift로 다 바꿔버려야겠다 ㅎㅎㅎ Swift Library에는 SwiftLint가 있어서 규칙을 정할 수 있을 때 좋았음 근데 Objective - C에 규칙을 정해놓은 게 아니라서 뒤죽바죽임ㅎㅎ... 본론으로 넘어가서 초기화를 보면 아래처럼 길~~게 적은게 보기가 싫어서 어떻게 못하나 했는데 - (void)ViewDidLoad { [super viewDidLoad]; NSArray *group..
오늘은 함수 작성 방법에 대해서 포스팅 해볼텐데 Swift가 참 간단하다고 생각이 듦.. 아무튼 본론으로 넘어가서 func testName(firstName fn: String, LastName ln: String) { print("내 이름은 \(fn)\(ln) 입니다") } Objective - C 의 경우 - (Void)testNameWithFrom:(NSString *)fn LastName:(NSString *)ln { return NSLog(@"제 이름은 %@%@ 입니다.",fn, ln); } // 사용할 때 - (Void)viewDidLoad { [self testNameWithFrom:@"홍" LastName:@"길동"]; } // 제 이름은 홍길동 입니다 - (반환값)프로퍼티 이름1:(프로퍼..
Objective-c 특징 - Swift가 대세이긴 하지만 Objective-c 레거시 코드가 많으니까 한번 정리하면서 공부해보고자 한다! Objective - c 코드를 Swift로 다 바꿀 수 있을 때까지 화이팅 1. .h(헤더) .m(본문) 파일로 분할되어 있음 2. nil 값을 선언할 수 있어서 컴파일 에러가 뜨지 않는다 3. guard let 구문이 없어서 if로 nil값을 분기 처리해줘야 한다 4. 메시지 구문형 언어 (Swift 보다 상세하게 작성해야 함) 5. Swift와 다르게 마이그레이션이 필요없음 6. ';'을 마지막에 붙여줘야 함, 블록코딩 [, ]을 사용해야함 7. Property 선언 시 초기에 명확하게 선언해야 함 8. ARC를 스스로 관리해야 함 9. build 속도는 늦으나..