728x90
적용한 Keyboard show, hide 감지 하는 기능이다.
나중에 상태 감지 후 bool 만 받아서 어떤 내용으로 감지할 때 쓰기 좋을 것 같고
처음 보는 코드들이 있어서 정리해본다.
import Foundation
import Combine
import UIKit
extension Publishers {
static var keyboardWillChange: AnyPublisher<Bool, Never> {
let willShow = NotificationCenter.default.publisher(for: UIResponder.keyboardWillShowNotification)
.map { _ in true }
let willHide = NotificationCenter.default.publisher(for: UIResponder.keyboardWillHideNotification)
.map { _ in false }
return MergeMany(willShow, willHide)
.eraseToAnyPublisher()
}
}
- MergeMany(willShow, willHide): 두 개의 퍼블리셔를 병합하여 하나의 퍼블리셔로 만드는 코드. 상태 변화에 따라 true 또는 false를 방출하는 단일 퍼블리셔를 얻을 수 있다.
- .eraseToAnyPublisher(): 퍼블리셔의 구체적인 타입 정보를 숨기고, AnyPublisher<Bool, Never> 타입으로 반환합니다. 이렇게 하면 퍼블리셔를 사용하는 측에서 구현 세부 사항에 의존하지 않고 사용할 수 있다.
감지하고 싶은 뷰에 달면 된다.
.onReceive(Publishers.keyboardWillChange) { isVisible in
self.isKeyboardVisible = isVisible
}
MergeMany 에 대해 자세히 살펴보는 예시코드
병합 함수를 적용하여 생성된 퍼블리셔
https://developer.apple.com/documentation/combine/publishers/mergemany
Publishers.MergeMany | Apple Developer Documentation
A publisher created by applying the merge function to an arbitrary number of upstream publishers.
developer.apple.com
eraseToAnyPublisher 에 대해 자세히 살펴보는 예시코드
https://developer.apple.com/documentation/combine/publisher/erasetoanypublisher()
public class TypeWithSubject {
public let publisher: some Publisher = PassthroughSubject<Int,Never>()
}
public class TypeWithErasedSubject {
public let publisher: some Publisher = PassthroughSubject<Int,Never>()
.eraseToAnyPublisher()
}
// In another module:
let nonErased = TypeWithSubject()
if let subject = nonErased.publisher as? PassthroughSubject<Int,Never> {
print("Successfully cast nonErased.publisher.")
}
let erased = TypeWithErasedSubject()
if let subject = erased.publisher as? PassthroughSubject<Int,Never> {
print("Successfully cast erased.publisher.")
}
// Prints "Successfully cast nonErased.publisher."
아아ㅏ아ㅏㅏ니 왜이렇게 공부할게 많은가ㅠㅠㅠㅠ
728x90
'iOS > Swift' 카테고리의 다른 글
내가 더 이상 헷갈리기 싫어서 적는 Swift의 핵심 구성 요소 (0) | 2025.05.01 |
---|---|
Managing your app’s life cycle (0) | 2025.04.30 |
SwiftData 모델에 있는 데이터가 빈 값일 수도 있고 아닐 수도 있을 때, 어떻게 처리해야하지? (0) | 2025.04.19 |
SwiftData 에서 여러개의 모델을 가져올 때 어떻게 해야할까? (1) | 2025.04.18 |
View에서 parameter를 선언할때 var, let 선택 기준 (2) | 2025.04.13 |