안녕하세요 모리스입니다.🙂
요즘 블로그 이사하느라 과거에 살아서 티스토리에 현생의 글을 쓰는건 이번이 첫 포스트네요.!
얼른 이사를 마치고 열심히 iOS앱에 관한 개발 포스트를 시작하고 싶네요 ㅎㅎ
이번 포스트는 iOS UIKit의 UIImage의 초기화 방식에 대한 내용입니다.
많이들 UIImage에서 초기화 하실 때 다음과 같이 하실거예요.
let imageView: UIImageView = UIImageView()
imageView.image = UIImage(named: "ic_icon")
// 또는
let imageView = UIImageView(image: .init(named: "ic_icon"))
위와 같이 UIImage를 초기화할때 named 프로퍼티를 사용해 이미지 이름을 넣어 초기화하죠!
그럼 여기서 UIImage(named: )는 무슨 역할을 하는지 보고갈까요?
✅ UIImage(named: String)
- iOS에서 이미지를 불러올 때 가장 많이 사용하는 방식.
- Asset Catalog에 있는 이미지 리소스를 불러올 때 사용.
- main bundle에서 Assets.xcassets에서 개발자가 입력한 이미지의 이름과 동일한 이름의 이미지를 찾음.
- 기본 리턴 값은 optional 즉, nil
- 내부적으로 이미지 캐싱이 되어있어 성능 우수.
와 같은 특징이 있어요.!
그.런.데
iOS앱 개발을 하시다보면 아니 그냥 개발을 많이 하다보면 가장 큰 버그가 뭘까요?
바로.. 오타.. 오타.. 오타..
진짜 별거 아닌것 같아도 영어 스펠링 하나 잘 못 입력 하면 은근 디버깅도 오래 걸리고...(저만 그런가요..?ㅎ)
.init(named: String)은 기본 리턴 값이 nil이에요.
게다가 named: 는 이미지 리소스의 이름을 String으로 받고 있어요.
보통 정의된 타입 기반으로 프로퍼티에 접근하다보면 잘 못되거나 없는 프로퍼티 접근시 런타임 에러를 내주지만..
String은 런타임에서 잡아내질 못해요.
그래서 이미지 리소스 이름을 잘 못 입력하고 앱을 빌드해보면 이미지가 뜨지 않는 경우가 종종있죠.
그래서 이번에 iOS 16부터 추가된 UIImage의 새로운 초기화 방식은 UIImage(resource: ImageResource)에 대해서 알아볼게요.
✅ UIImage(resource: ImageResource)
- iOS 17+ 지원
- XCode가 자동 생성해주는 Image Catalog 기반 리소스 접근자.
- 이미지 리소스를 Assets.xcassets에 추가하면, swift가 ImageResource로 컴파일 타임에 접근할 수 있음. (iOS 13.3이상 부터)
- ImageResource 타입으로, 컴파일 타임에 존재가 보장되어야 함.
- 기본 리턴 값은 non-optional
- 런타임 에러 방지에 유리(컴파일 시점에 잘못된 이름을 잡아냄)
ImageResource 타입을 기본 리턴 값으로 가지고 있기 때문에 named와 다르게 non-optional이예요.
개발자가 잘 못된 리소스 접근 시 컴파일러에서 에러를 내준답니다.!
그럼 ImageResource 타입은 뭘까요??
✅ ImageResource
ImageResource는 Foundation에서 제공하는 Resource 프로토콜을 체택한 구조체로, 앱의 이미지 리소스를 타입으로 관리하게 해주는 타입 중 하나예요.
당연히 타입으로 이미지 리소스를 관리하기 때문에 리소스에 접근할 때 안전하게 접근할 수 있겠죠?
- Foundation 프레임 워크.
- 이미지 파일을 문자열이 아닌 정적 타입으로 식별.
- Swift 매크로 시스템에 의해 자동 생성(Xcode 15+)
Xcode 프로젝트 내에 이미지 리소스를 넣으면 Swift 리소스 메크로 시스템이 ImageResource로 자동 생성해줘요.
Sources/
└── MyModule/
├── MyFile.swift
└── Assets/
└── icIcon.png
Assets에 이미지 리소스가 있으면 ImageResource가 자동 생성돼요. (.myImage)'
let imageView = UIImageView()
imageView.image = UIImage(resource: .icIcon)
참고로!
기존에 이미지 리소스 이름을 snake_case로 작성했다면 Swift 메크로 시스템이 ImageResource를 생성할 때 snake_case였던 리소스 이름을 camelCase로 자동 변환 시켜요.
그래서 ImageResource에 접근할 때 camelCase로 접근해야 돼요.
이상 끝!
잘 못되었거나 수정할 부분이 있다면 언제든 댓글로 혼내주시길 바랍니다.!!
오늘도 긴 글 읽어주셔서 감사합니다.😊
'iOS' 카테고리의 다른 글
[iOS] TableView reloadSections (0) | 2025.04.13 |
---|