programing

responseToSelector의 Swift는 무엇입니까?

closeapi 2023. 4. 11. 22:03
반응형

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가지 방법으로 확인할 수 있습니다.

  1. @Erik_at_Digit에 의해 응답된 respons To Selector 사용
  2. @Sulthan이 대답한 ?를 사용하여

  3. ,, 용을 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

반응형