responseToSelector의 Swift는 무엇입니까?
검색을 해봤지만 swift가 어떤 것에 해당하는지 찾을 수 없었습니다.respondsToSelector:
이에요.
이것이 제가 찾을 수 있는 유일한 것입니다(Swift 대체 수단으로서 ResponseToSelector:) 그러나 제 경우에는 위임자의 존재여부를 체크하는 것과 별로 관련이 없습니다.단, 디바이스 상에서 실행할 때 새로운 API가 존재하는지 확인하고 이전 버전의 API로 폴백하지 않는지를 확인하고 싶을 뿐입니다.
전술한 바와 같이 Swift에서는 대부분의 경우 옵션 언래퍼 오퍼레이터를 사용하여 필요한 것을 얻을 수 있습니다.이를 통해 객체가 존재하는 경우에만 객체에 대한 메서드를 호출할 수 있습니다(없음).nil
이 메서드가 구현됩니다.
아직 필요한 경우respondsToSelector:
의 일부로서 아직 존재하고 있습니다.NSObject
프로토콜입니다.
전화하시는 경우respondsToSelector:
Swift의 Obj-C 타입에서는 예상대로 동작합니다.만약 당신이 당신의 Swift 클래스에서 그것을 사용하고 있다면 당신은 당신의 클래스가 다음 클래스에서 파생되는지 확인해야 합니다.NSObject
.
다음으로 Swift 클래스가 셀렉터에 응답하는지 확인할 수 있는 예를 나타냅니다.
class Worker : NSObject
{
func work() { }
func eat(food: AnyObject) { }
func sleep(hours: Int, minutes: Int) { }
}
let worker = Worker()
let canWork = worker.respondsToSelector(Selector("work")) // true
let canEat = worker.respondsToSelector(Selector("eat:")) // true
let canSleep = worker.respondsToSelector(Selector("sleep:minutes:")) // true
let canQuit = worker.respondsToSelector(Selector("quit")) // false
파라미터 이름을 빠뜨리지 않는 것이 중요합니다.이 예에서는,Selector("sleep::")
같지 않다Selector("sleep:minutes:")
.
진정한 Swift 대체자는 없다.
다음과 같은 방법으로 확인할 수 있습니다.
someObject.someMethod?()
그러면 메서드가 호출됩니다.someMethod
오브젝트에 정의되어 있는 경우에만someObject
사용하실 수 있는 것은@objc
그 방법을 선언한 의정서optional
.
Swift는 원래 안전한 언어이기 때문에 메서드를 호출할 때마다 Swift는 메서드가 있는지 알아야 합니다.런타임 확인이 불가능합니다.무작위로 객체에 무작위로 메서드를 호출할 수는 없습니다.
Obj-C에서도 ARC와 잘 어울리지 않기 때문에 가능한 한 이러한 것은 피해야 합니다(ARC는 다음 경고에 대해 트리거합니다).performSelector:
).
단, 사용 가능한 API를 확인할 때는respondsToSelector:
스위프트라고 해도NSObject
인스턴스:
@interface TestA : NSObject
- (void)someMethod;
@end
@implementation TestA
//this triggers a warning
@end
var a = TestA()
if a.respondsToSelector("someMethod") {
a.someMethod()
}
Swift 3 구문용 2017년 3월 20일 업데이트:
옵션 메서드가 존재하는지 여부에 관심이 없으면 전화만 하면 됩니다.delegate?.optionalMethod?()
그 이외의 경우는,guard
아마도 가장 좋은 접근법일 것입니다.
weak var delegate: SomeDelegateWithOptionals?
func someMethod() {
guard let method = delegate?.optionalMethod else {
// optional not implemented
alternativeMethod()
return
}
method()
}
원답:
다음과 같은 옵션 프로토콜을 테스트하려면 "if let" 방식을 사용할 수 있습니다.
weak var delegate: SomeDelegateWithOptionals?
func someMethod() {
if let delegate = delegate {
if let theMethod = delegate.theOptionalProtocolMethod? {
theMethod()
return
}
}
// Reaching here means the delegate doesn't exist or doesn't respond to the optional method
alternativeMethod()
}
테스트 중인 메서드가 @objc 프로토콜에서 옵션 메서드로 정의되어 있는 경우(사용자의 경우와 같음), 다음과 같이 옵션 체인 패턴을 사용합니다.
if let result = object.method?(args) {
/* method exists, result assigned, use result */
}
else { ... }
가 returning "으로 Void
, "사용방법":
if object.method?(args) { ... }
참조:
콜 "콜 방법"
애플 주식회사 언어는 '''는''''''''''''''''는''는
아이북스https://itun.es/us/jEUH0.l
프로토콜을 NSObjectProtocol의 하위 프로토콜로 정의해야 합니다.그러면 response To Selector 메서드가 표시됩니다.
@objc protocol YourDelegate : NSObjectProtocol
{
func yourDelegateMethod(passObject: SomeObject)
}
@objc만 지정하는 것만으로는 충분하지 않다는 점에 유의하십시오.또한 실제 대리인은 NSObject의 하위 클래스이지만 Swift에서는 그렇지 않을 수 있습니다.
신속한 대응 3
메서드를 호출하려면 아래 코드를 실행합니다.
self.delegate?.method?()
함수는 Swift에서 1등급 유형이므로 프로토콜에 정의된 선택적 함수가 구현되었는지 여부를 0과 비교하여 확인할 수 있습니다.
if (someObject.someMethod != nil) {
someObject.someMethod!(someArgument)
} else {
// do something else
}
스위프트 2에서 애플은 라고 불리는 새로운 기능을 도입했다.API availability checking
가 될 respondsToSelector:
방법.다음 코드 스니펫 비교는 WWDC2015 Session 106 What's New in Swift에서 복사한 것으로, 도움이 될 것으로 생각됩니다.자세한 것은 확인해 주세요.
구식 접근법:
@IBOutlet var dropButton: NSButton!
override func awakeFromNib() {
if dropButton.respondsToSelector("setSpringLoaded:") {
dropButton.springLoaded = true
}
}
더 나은 접근법:
@IBOutlet var dropButton: NSButton!
override func awakeFromNib() {
if #available(OSX 10.10.3, *) {
dropButton.springLoaded = true
}
}
신속한 3.0의 경우
import UIKit
@objc protocol ADelegate : NSObjectProtocol {
@objc optional func hi1()
@objc optional func hi2(message1:String, message2:String)
}
class SomeObject : NSObject {
weak var delegate:ADelegate?
func run() {
// single method
if let methodHi1 = delegate?.hi1 {
methodHi1()
} else {
print("fail h1")
}
// multiple parameters
if let methodHi2 = delegate?.hi2 {
methodHi2("superman", "batman")
} else {
print("fail h2")
}
}
}
class ViewController: UIViewController, ADelegate {
let someObject = SomeObject()
override func viewDidLoad() {
super.viewDidLoad()
someObject.delegate = self
someObject.run()
}
// MARK: ADelegate
func hi1() {
print("Hi")
}
func hi2(message1: String, message2: String) {
print("Hi \(message1) \(message2)")
}
}
현재(Swift 2.1) 3가지 방법으로 확인할 수 있습니다.
- @Erik_at_Digit에 의해 응답된 respons To Selector 사용
@Sulthan이 대답한 ?를 사용하여
,, 용을
as?
★★★★★★★★★★★★★★★★★★:if let delegateMe = self.delegate as? YourCustomViewController { delegateMe.onSuccess() }
기본적으로 달성하려는 목표에 따라 달라집니다.
- 예를 들어 앱 로직에서 어떤 액션을 수행해야 하는데 위임자가 설정되지 않았거나 지적된 위임자가 onSuccess() 메서드(프로토콜 메서드)를 구현하지 않은 경우 옵션 1과 3이 최선의 선택입니다.단, 옵션 3은 Swift 방식을 사용합니다.
- 위임자가 0이거나 메서드가 구현되지 않은 경우 아무것도 수행하지 않으려면 옵션 2를 사용하십시오.
이전 프로젝트를 Swift 3.2로 업데이트하기 시작했기 때문에 방법을 변경하기만 하면 되었습니다.
respondsToSelector(selector)
대상:
responds(to: selector)
프로젝트 내에서 직접 구현하고 있습니다.아래 코드를 참조해 주세요.@Christopher Pickslay에서 언급했듯이 함수는 퍼스트 클래스 시민이므로 옵션 변수처럼 취급할 수 있다는 점을 기억해야 합니다.
@objc protocol ContactDetailsDelegate: class {
optional func deleteContact(contact: Contact) -> NSError?
}
...
weak var delegate:ContactDetailsDelegate!
if let deleteContact = delegate.deleteContact {
deleteContact(contact)
}
swift에 의한 다른 가능한 구문..
if let delegate = self.delegate, method = delegate.somemethod{
method()
}
용 i i i i를 쓴다.guard let else
따라서 위임 펑크가 구현되지 않은 경우 디폴트 작업을 수행할 수 있습니다.
@objc protocol ViewController2Delegate: NSObjectProtocol {
optional func viewController2(controller: ViewController2, didSomethingWithStringAndReturnVoid string: String)
optional func viewController2(controller: ViewController2, didSomethingWithStringAndReturnString string: String) -> String
}
class ViewController2: UIViewController {
weak var delegate: ViewController2Delegate?
@IBAction func onVoidButtonClicked(sender: AnyObject){
if (delegate != nil && delegate!.respondsToSelector(Selector("viewController2:didSomethingWithStringAndReturnVoid:"))) {
NSLog("ReturnVoid is implemented")
delegate!.viewController2!(self, didSomethingWithStringAndReturnVoid: "dummy")
}
else{
NSLog("ReturnVoid is not implemented")
// Do something by default
}
}
@IBAction func onStringButtonClicked(sender: AnyObject){
guard let result = delegate?.viewController2?(self, didSomethingWithStringAndReturnString: "dummy") else {
NSLog("ReturnString is not implemented")
// Do something by default
return
}
NSLog("ReturnString is implemented with result: \(result)")
}
}
위임자에 대한 기본 구현을 원하는 것 같습니다.다음과 같이 할 수 있습니다.
let defaultHandler = {}
(delegate?.method ?? defaultHandler)()
스위프트 3:
프로토콜
@objc protocol SomeDelegate {
@objc optional func method()
}
물건
class SomeObject : NSObject {
weak var delegate:SomeObject?
func delegateMethod() {
if let delegateMethod = delegate?.method{
delegateMethod()
}else {
//Failed
}
}
}
이 값은 ? 연산자입니다.
var value: NSNumber? = myQuestionableObject?.importantMethod()
myQuestibleObject가 존재하고 구현되어 있는 경우에만 secrantMethod가 호출됩니다.
언급URL : https://stackoverflow.com/questions/24167791/what-is-the-swift-equivalent-of-respondstoselector
'programing' 카테고리의 다른 글
Python의 패스 스테이트먼트에 해당하는 Bash는 무엇입니까? (0) | 2023.04.11 |
---|---|
Objective-C 및 Swift URL 인코딩 (0) | 2023.04.11 |
Midi 컨트롤러를 통한 Excel 제어 (0) | 2023.04.11 |
git commit 메시지에서 과거 시제를 사용해야 합니까, 아니면 현재 시제를 사용해야 합니까? (0) | 2023.04.11 |
Objective-C에서 오브젝트를 캐스팅하는 방법 (0) | 2023.04.11 |