iOS

[iOS] UIImage 초기화 named와 resource

모리스🙂 2025. 4. 11. 00:49

안녕하세요 모리스입니다.🙂

요즘 블로그 이사하느라 과거에 살아서 티스토리에 현생의 글을 쓰는건 이번이 첫 포스트네요.!

얼른 이사를 마치고 열심히 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

ImageResourceFoundation에서 제공하는 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