[TIL] 10.02

Junyoung_Hong·2023년 10월 2일
0

TIL_10월

목록 보기
1/20
post-thumbnail

1. NSObject

프로젝트를 진행하면 아키텍처를 보통 MVC, MVVM 중에 선택하는 경우가 대부분이다. 이 때, Model에 들어가는 파일은 UI와 관련된 요소들을 배제하기 때문에 UIKit을 import 하지 않는 방향으로 진행을 한다.

https://developer.apple.com/documentation/objectivec/nsobject

1-1. Model 게층에 UIKit을 import 하지 않는 이유

UIKit은 주로 사용자 인터페이스(UI)와 관련된 클래스 및 프레임워크로, 모델 계층은 비즈니스 로직과 데이터 처리를 다루는 곳이다. 모델 계층에서 UIKit을 직접 import하면 코드의 의존성이 혼란스러워질 수 있고, 테스트성을 저해할 수 있다.

  1. 의존성 분리(Dependency Separation): 모델 계층은 비즈니스 로직과 데이터를 다루는데 집중해야 한다. UIKit은 사용자 인터페이스와 관련이 있으므로 이러한 의존성을 모델 계층과 분리하는 것이 중요하다. 이렇게 하면 코드를 더 격리된 방식으로 테스트하고 재사용하기 쉬워진다.

  2. 재사용성: 모델 계층을 UIKit에 의존적으로 만들면 이 모델을 다른 프로젝트에서 재사용하기 어려울 수 있다. UIKit이 없는 환경에서 모델을 사용해야 할 때 문제가 발생할 수 있다.

  3. 유지보수성: 프로젝트가 성장하고 복잡해질수록 UIKit에 의존하지 않는 모델을 유지하는 것이 코드의 유지보수성을 향상시키는 데 도움이 된다.

대신, 모델 계층에서 UIKit을 import하지 않고 순수한 Swift 또는 Objective-C 클래스를 사용하여 비즈니스 로직과 데이터 처리를 구현하는 것이 좋다.

1-2. NSObject의 역할

NSObject는 Objective-C와의 상호 운용성(interoperability)을 제공하기 위한 중요한 클래스이다. 또한 NSObject는 Foundation 프레임워크의 여러 기능 및 클래스와 함께 사용할 수 있다.

이미지 출처: https://clamp-coding.tistory.com/438

NSObject는 모든 Objective-C 클래스의 최상위 부모 클래스이며 Objective-C 클래스와 객체와 상호 작용할 때 중요한 역할을 한다.
Objective-C에서는 모든 클래스가 NSObject 클래스를 상속받으므로, 스위프트에서도 이러한 클래스와 객체와 상호 작용하기 위해 NSObject를 사용한다.

import Foundation

class MySwiftClass: NSObject {
    var name: String
    
    init(name: String) {
        self.name = name
    }
}

// Objective-C 코드와 상호 작용 예제
let mySwiftObject = MySwiftClass(name: "John")
let myObjectiveCObject: NSObject = mySwiftObject

// Objective-C 객체로부터 스위프트 객체로 형변환
if let convertedSwiftObject = myObjectiveCObject as? MySwiftClass {
    print("Converted name: \(convertedSwiftObject.name)")
}

MySwiftClass가 NSObject를 상속받고, 스위프트 객체를 Objective-C 객체로 형변환하고 다시 스위프트 객체로 형변환하는 과정이다.

1-3. Model 계층에 적용

GPS를 활용하기 위한 Manager를 따로 분리했었다. delegate를 UIViewController로 설정하기 위해 UIViewController를 상속했었다.

import UIKit
import CoreLocation

class GPSManager: UIViewController, CLLocationManagerDelegate {
	.
	.
	.
}

그러나 Model 계층에 좀 더 알맞게, NSObject를 이용하여 수정하였다.

import Foundation
import CoreLocation

class GPSManager: NSObject, CLLocationManagerDelegate {
	.
	.
	.
}
profile
iOS 개발자를 향해 성장 중

0개의 댓글