iOS/Swift

상태를 감지하는 방법

태애니 2025. 4. 23. 09:15
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