2017-01-27 7 views
4

로컬 알림을 사용하고 iOS 10을 지원하는 앱이 있습니다. 이전 위치 알림 API를 사용해야하는 iOS 9 지원을 추가하려고합니다. 내 iOS 10 코드에서 @available 및 #available을 사용하려고하는데 iOS 10을 실행하는 기기에서만 내 센터 변수를 가져 오는 방법을 알아낼 수 없습니다.저장된 속성으로 @available 사용하기

대상을 iOS 10에서 9이 변수에 대한 오류 메시지가 표시됩니다. "UNUserNotificationCenter는 iOS 10.0 이상에서만 사용 가능합니다." 내가 iOS 9에 사용될이 클래스의 코드가 있기 때문에 내가 원하지 않는 내 전체 클래스에 "@available (iOS 10.0, *)"을 추가 할 것을 제안합니다. 센터 건물은 아이폰 OS (10)

class ViewController: UIViewController, UITextFieldDelegate { 

    let center = UNUserNotificationCenter.current() 
    ... 

답변

1

@available가 아닌 속성에 대한, 전체 클래스 또는 하나 개 이상의 기능의 주위에 사용할 수 있습니다. 당신의 UNUserNotificationCenter 사용에 관한

current 절대 변경, 왜 그냥 center 상수를 제거하지, 그냥 center를 사용 UNUserNotificationCenter.current()을 사용하여 싱글 톤을 반환?

+0

감사합니다. – chickenparm

-1
let validClass = NSClassFromString("UNUserNotificationCenter") != nil 

사용 validClass 같은 아이폰 OS (10)에 대한 특정 코드 결정 : 아래

if validClass 
    // iOS 10 code 
else 
    // Earlier than iOS 10 code 
+0

이것은 유용한 정보를 찾는 좋은 방법이 아닙니다. 애플이 선호하는 방법은'if #available()'문법이다. 그러나 두 가지 방법 (이 대답이나'if # available')은 저장된 속성에 사용할 수 없습니다. – willrichman

8

은 (blog post 덕분에) 잠재적 인 솔루션입니다.

아이디어는 유형이 Any 인 저장된 속성을 사용한 다음 저장된 속성을 캐스팅하고 필요한 경우 인스턴스를 생성하는 계산 된 속성을 만드는 것입니다.

private var _selectionFeedbackGenerator: Any? = nil 
@available(iOS 10.0, *) 
fileprivate var selectionFeedbackGenerator: UISelectionFeedbackGenerator { 
    if _selectionFeedbackGenerator == nil { 
     _selectionFeedbackGenerator = UISelectionFeedbackGenerator() 
    } 
    return _selectionFeedbackGenerator as! UISelectionFeedbackGenerator 
} 
관련 문제