Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 클린 코드
- swift documentation
- UITextView
- MVVM
- combine
- uiscrollview
- Human interface guide
- SWIFT
- RxCocoa
- 리펙토링
- 스위프트
- clean architecture
- 리팩토링
- uitableview
- map
- rxswift
- Refactoring
- collectionview
- 리펙터링
- 애니메이션
- tableView
- Xcode
- ios
- swiftUI
- Observable
- HIG
- UICollectionView
- ribs
- Clean Code
- Protocol
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] Objective-C 런타임 라이브러리 (#selector, #keyPath) 본문
iOS 응용 (swift)
[iOS - swift] Objective-C 런타임 라이브러리 (#selector, #keyPath)
jake-kim 2023. 5. 25. 01:13Objective-C 런타임 라이브러리란?
- swift 언어에서 런타임 때 특정 기능을 사용할 수 있는 Objective-C에 내장된 API
- dynamic Objective-C API 라고도 명칭
- swift에서 #selector, #keyPath 등과 같은 것들을 사용하는데 이런 것들이 모두 dynamic Objective-C API
- dynamically하게 메소드, 프로퍼티를 호출하거나 접근하는 테크닉
- 동적으로 메소드나 프로퍼티를 참조
- 메소드에 참조 - selector
- 프로퍼티에 참조 - keyPath
#selector 란?
- target, action pattern에서, action을 정할때 action에 관한 메소드를 참조할 때 #selector를 사용
- Objective-C에서는 selector라고 부르고 swift에서는 첫글자가 대문자인 Selector라고 명칭
- Selector는 struct 타입
- 사용할땐 #selector() 키워드로 사용
import UIKit
class MyViewController: UIViewController {
let myButton = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 50))
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(myButton)
let action = #selector(MyViewController.tappedButton)
myButton.addTarget(self, action: action, for: .touchUpInside)
}
@objc func tappedButton(_ sender: UIButton?) {
print("tapped button")
}
}
#keyPath
- Objective-C에서 객체의 프로퍼티의 id를 나타내는 키는 문자열인데, 이 문자열들은 참조하는 키워드가 #keyPath
- 쉽게 생각해서 swift에서의 프로퍼티들을 #keyPath안에 넣으면 Objective-C에서 사용하던 키 값 형태(문자열) 접근이 가능
class Person: NSObject {
@objc var name: String
@objc var friends: [Person] = []
@objc var bestFriend: Person? = nil
init(name: String) {
self.name = name
}
}
// Objective-C에서 키값인 문자열에 접근하는 방법: #keyPath로 접근
#keyPath(Person.name) // "name"
- key값은 Objective-C에서 문자열이었고, 이때 이 key에 해당하는 값을 value라고 하는데, swift언어로 객체.value(forKey:)로 접근이 가능
- 이를 key - value coding이라고 명칭
- 문자열에 접근하는 방식이 컴파일타임에 타입을 체크하며 접근한다는 것이 의미가 있는 것
let gabrielle = Person(name: "Gabrielle")
let jim = Person(name: "Jim")
let yuanyuan = Person(name: "Yuanyuan")
gabrielle.friends = [jim, yuanyuan]
gabrielle.bestFriend = yuanyuan
gabrielle.value(forKey: #keyPath(Person.name))
// "Gabrielle"
gabrielle.value(forKeyPath: #keyPath(Person.friends.name))
// ["Yuanyuan", "Jim"]
cf) Objective-C 런타임 라이브러리 더 알아보기
- 아래 API를 사용하여 swizzling하는 방법은 이 포스팅 글 참고
- class_getInstanceMethod
- method_exchangeImplementations
* 참고
https://developer.apple.com/documentation/objectivec/selector
https://developer.apple.com/documentation/swift/using-objective-c-runtime-features-in-swift
'iOS 응용 (swift)' 카테고리의 다른 글
Comments