스위프트의 @selector ()?


659

나는 만들려고 해요 NSTimer에서을 Swift하지만 몇 가지 문제가 있어요.

NSTimer(timeInterval: 1, target: self, selector: test(), userInfo: nil, repeats: true)

test() 같은 클래스의 함수입니다.


편집기에서 오류가 발생합니다.

제공된 인수를 허용하는 'init'에 대한 과부하를 찾을 수 없습니다.

나는 변경하는 경우 selector: test()selector: nil오류 사라집니다.

난 노력 했어:

  • selector: test()
  • selector: test
  • selector: Selector(test())

그러나 아무것도 작동하지 않으며 참조에서 해결책을 찾을 수 없습니다.


11
selector: test()호출 test하고 반환 값을 selector인수에 전달합니다.
Michael Dorst 2018 년

답변:


930

스위프트 자체 는 선택기를 사용하지 않습니다. Objective-C에서 선택기를 사용하는 여러 디자인 패턴이 스위프트에서 다르게 작동합니다. (예를 들어, 프로토콜 유형 또는 is/ as테스트 대신 선택적 체인을 respondsToSelector:사용 performSelector:하고 더 나은 유형 / 메모리 안전 을 위해 가능한 경우 클로저를 사용하십시오 .)

그러나 타이머와 타겟 / 액션 패턴을 포함하여 선택기를 사용하는 중요한 ObjC 기반 API가 여전히 많이 있습니다. Swift는 Selector이러한 작업을위한 유형을 제공합니다 . (Swift는 ObjC SEL유형 대신 이것을 자동으로 사용 합니다.)

Swift 2.2 (Xcode 7.3) 이상 (Swift 3 / Xcode 8 및 Swift 4 / Xcode 9 포함) :

표현식을 Selector사용하여 Swift 함수 유형에서을 구성 할 수 있습니다 #selector.

let timer = Timer(timeInterval: 1, target: object,
                  selector: #selector(MyClass.test),
                  userInfo: nil, repeats: false)
button.addTarget(object, action: #selector(MyClass.buttonTapped),
                 for: .touchUpInside)
view.perform(#selector(UIView.insertSubview(_:aboveSubview:)),
             with: button, with: otherButton)

이 방법에 대한 좋은 점은? 함수 참조는 Swift 컴파일러에 의해 확인되므로 #selector실제로 존재하며 선택 자로 사용할 수있는 클래스 / 메소드 쌍에서만 표현식을 사용할 수 있습니다 (아래 "선택기 가용성"참조). 또한 함수 유형 이름 지정에 대한 Swift 2.2+ 규칙에 따라 필요한만큼만 함수 참조를 자유롭게 작성할 수 있습니다 .

(이것은 @selector()컴파일러의 -Wundeclared-selector검사가 명명 된 선택기가 존재하는지 확인 하기 때문에 실제로 ObjC의 지시문에 비해 개선 된 것입니다. 스위프트 함수 참조 #selector는 존재, 클래스 멤버쉽 및 유형 서명 을 검사 하기 위해 전달합니다 .)

#selector표현식에 전달하는 함수 참조에 대한 몇 가지 추가 경고가 있습니다 .

  • 기본 이름이 동일한 여러 함수 는 함수 참조에 대해 위에서 언급 한 구문을 사용하여 매개 변수 레이블로 구별 할 수 있습니다 (예 : insertSubview(_:at:)vs insertSubview(_:aboveSubview:)). 그러나 함수에 매개 변수가없는 경우이를 명확히하는 유일한 방법 as은 함수의 형식 서명 (예 : foo as () -> ()vs foo(_:))이 있는 캐스트 를 사용하는 것입니다 .
  • Swift 3.0+에는 속성 getter / setter 쌍에 대한 특별한 구문이 있습니다. 예를 들어, 주어진 var foo: Int경우 #selector(getter: MyClass.foo)또는 을 사용할 수 있습니다 #selector(setter: MyClass.foo).

일반 사항 :

사례 #selector연구 및 명명을하지 않습니다는 : 때때로 당신은 (동적 ObjC 런타임에 등록 된 방법으로, 예를 들어)와 선택기를 만들 수있는 함수 참조가 없습니다. 이 경우 Selector문자열에서 from을 구성 할 수 있습니다 . 예를 들어 Selector("dynamicMethod:")— 컴파일러의 유효성 검사를 잃어 버립니다. 그렇게 할 때 :각 매개 변수에 콜론 ( )을 포함하여 ObjC 이름 지정 규칙을 따라야 합니다.

선택기 가용성 : 선택기에서 참조하는 메소드는 ObjC 런타임에 노출되어야합니다. Swift 4에서 ObjC에 노출 된 모든 메소드에는 @objc속성 앞에 선언이 있어야 합니다. (이전 버전에서는 경우에 따라 해당 속성이 무료로 제공되었지만 이제는 명시 적으로 선언해야합니다.)

private심볼도 런타임에 노출되지 않는다는 점에 유의 하십시오. 메소드에는 최소한 internal가시성 이 있어야 합니다.

주요 경로 : 이들은 선택자와 관련되어 있지만 동일하지는 않습니다. Swift 3에는 특별한 구문이 chris.valueForKeyPath(#keyPath(Person.friends.firstName))있습니다. 자세한 내용은 SE-0062 를 참조하십시오. KeyPathSwift 4 에서는 훨씬 더 많은 것들이 있으므로 적절한 경우 선택기 대신 올바른 KeyPath 기반 API를 사용하고 있는지 확인하십시오.

당신은 아래 선택기에 대한 자세한 읽을 수 오브젝티브 C API를 상호 작용코코아 및 목표 - C와 스위프트를 사용 .

참고 : Swift 2.2 이전에는을 Selector준수 StringLiteralConvertible하므로 베어 문자열이 선택기를 사용하는 API로 전달되는 오래된 코드를 찾을 수 있습니다. Xcode에서 "현재 스위프트 구문으로 변환"을 실행하여을 사용하는 사용자를 얻으십시오 #selector.


8
함수 이름을 가진 문자열을 입력하면 NSSelectorFromString ()도 작동합니다.
Arbitur

7
"Objective-C API와의 상호 작용"이 웹 사이트에 있지만 'The Swift Programming Language'책에는 없다고 언급하고 싶습니다.

10
인수가 필요한 경우 선택기 끝에 ":"이 필요하다는 것을 언급해야합니다. (예 : test ()-> "test"& test (this : String)-> "test :")
Daniel Schlaug

2
또한 Cocoa 프레임 워크는 Objective-C 스타일의 메소드 이름을 필요로합니다. 메소드가 인수를 취하면 ':'가 필요합니다. 두 개의 인수를 취 size:andShape:하면 첫 번째 인수의 이름이 지정된 경우에는 다음이 필요합니다 With. 예 initWithData::func init(Data data: NSData)
JMFR

6
어쨌든 "선택기"를 문자열로 전달하는 것에 대한 유효성 검사를 추가해야합니까? 철자가
틀리면

86

SelectorSwift 에서 클래스 를 사용하는 방법에 대한 간단한 예는 다음과 같습니다 .

override func viewDidLoad() {
    super.viewDidLoad()

    var rightButton = UIBarButtonItem(title: "Title", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("method"))
    self.navigationItem.rightBarButtonItem = rightButton
}

func method() {
    // Something cool here   
}

문자열로 전달 된 메서드가 작동하지 않으면 런타임에 실패하고 컴파일 시간이 아니라 앱이 중단됩니다. 조심해


13
끔찍한 ... "NSStringFromSelector"유형의 것이 있습니까?
Lena Bru

11
objc가 이것을 가지고 있기 때문에 그들이 선택되지 않은 선택자를 위해 디자인했다고 믿을 수 없다
malhal

4
@malcomhall : @selector편리하지만 생각한대로 공식적으로 적용되지는 않습니다. "선언되지 않은 선택기"는 컴파일러의 경고 일뿐입니다. 런타임시 새로운 선택기가 항상 도입 될 수 있기 때문입니다. Swift의 검증 가능 / 리팩터링 선택기 참조 는 좋은 기능 요청 이 될 것 입니다.
rickster

2
이 답변은 도움이되지만 @objc의 아래 답변이 더 적합합니다.
cynistersix

선택기 문자열을 변수 또는 매개 변수로 전달할 때 Selector () 함수를 사용하여 선택기에 문자열을 선택자에게 알려 주어야합니다. 감사합니다
levous

46

또한 (Swift) 클래스가 Objective-C 클래스의 하위 클래스가 아닌 경우 대상 메소드 이름 문자열 끝에 콜론이 있어야하고 대상 메소드와 함께 @objc 특성을 사용해야합니다. 예 :

var rightButton = UIBarButtonItem(title: "Title", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("method"))

@objc func method() {
    // Something cool here   
} 

그렇지 않으면 런타임에 "인식 할 수없는 선택기"오류가 발생합니다.


3
1. 콜론이있는 선택자는 인수를 가져와야합니다. 2. Apple 문서에 따라 타이머의 조치는 NSTimer 인수를 가져와야 Selector합니다. 키워드는 필수가 아닙니다. 따라서이 경우에는 서명이 있어야합니다@objc func method(timer: NSTimer) {/*code*/}
예븐 두비 닌

@objc나를 위해 일했다. timer: NSTimer메소드 서명에 포함시킬 필요가 없었습니다 .
Mike Taverne 2019

32

Swift 2.2 이상 및 Swift 3 업데이트

새로운 #selector표현식을 사용하면 문자열 리터럴을 사용할 필요가 없어 오류 발생이 줄어 듭니다. 참고로 :

Selector("keyboardDidHide:")

된다

#selector(keyboardDidHide(_:))

또한보십시오 : 신속한 진화 제안

참고 (Swift 4.0) :

사용 #selector하는 경우 기능을 다음과 같이 표시해야합니다@objc

예:

@objc func something(_ sender: UIButton)


26

스위프트 4.0

아래와 같이 선택기를 만듭니다.

1. 다음과 같은 버튼에 이벤트를 추가하십시오.

button.addTarget(self, action: #selector(clickedButton(sender:)), for: UIControlEvents.touchUpInside)

기능은 다음과 같습니다.

@objc func clickedButton(sender: AnyObject) {

}

4
당신은 넣어 잊었 @objc전에 func스위프트 4에 요구되는
바히드 아미리

24

장래 독자들을 위해, 나는 문제 unrecognised selector sent to instance가 발생했고 대상 func을 개인 으로 표시하여 발생 하는 오류가 발생 한다는 것을 알았습니다 .

func 반드시 셀렉터에 대한 참조 목적으로 불릴 공개적으로 표시.


13
그것은하지 않습니다 여전히 개인 방법을 유지하지만 추가 할 수 있습니다 공개하는 objc그것의 선언 앞에. 예 : @objc private func foo() { ...그러면 "foo"원하는만큼 셀렉터로 사용할 수 있습니다
apouche

또한 internal액세스 수정자를 지정하지 않을 수도 있습니다 . 나는 종종이 패턴을 사용한다 ://MARK: - Selector Methods\n extension MyController {\n func buttonPressed(_ button: UIButton) {
Sajjon

19

NSTimer에서 다른 사람과 같은 문제를 겪고있는 누군가 가이 문제를 해결하지 못한 경우 NSObject에서 상속하지 않는 클래스를 계층 구조의 직접 또는 깊게 상속하지 않는 클래스를 사용하는 경우 실제로 언급하는 것이 중요합니다. 예를 들어 수동으로 생성 된 빠른 파일)의 경우 다음과 같이 지정된 경우에도 다른 답변은 작동하지 않습니다.

let timer = NSTimer(timeInterval: 1, target: self, selector: "test", 
                    userInfo: nil, repeats: false)
func test () {}

NSObject에서 클래스를 상속받는 것 이외의 다른 것을 변경하지 않고 "인식되지 않은 선택기"오류가 발생하지 않고 논리가 예상대로 작동했습니다.


이 대안의 문제는 ViewController 클래스 구현 물건 (예 : viewDidLoad ())이 필요한 경우 NSObject에서 상속하도록 클래스 (ViewController라고 함)를 변경할 수 없다는 것입니다. NSTimer를 사용하여 ViewController 내에서 Swift 함수를 호출하는 방법에 대한 아이디어가 있습니까? ... e
eharo2

1
UIViewController는 이미 NSObject로부터 상속받습니다. 대부분의 클래스는 SDK에 의해 노출되어 있습니다.이 예제는 NSTimer 기능을 필요로하는 사용자가 만든 클래스를위한 것입니다.
Martin Cazares

14

NSTimer에서 함수에 매개 변수를 전달하려면 다음과 같이하십시오.

var somethingToPass = "It worked"

let timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: "tester:", userInfo: somethingToPass, repeats: false)

func tester(timer: NSTimer)
{
    let theStringToPrint = timer.userInfo as String
    println(theStringToPrint)
}

선택기 텍스트 (테스터 :)에 콜론을 포함하면 매개 변수가 userInfo로 이동합니다.

함수는 NSTimer를 매개 변수로 취해야합니다. 그런 다음 userInfo를 추출하여 전달 된 매개 변수를 가져 오십시오.


3
NSTimer (0.01, target : self, ...)가 작동하지 않는 반면 NSTimer.scheduledTimerWithTimeInterval (0.01, ..) DID가 작동합니다!? 이상하지만 답변 @ 스쿠터 감사합니다!
코더

1
아이폰 OS-코더 단지 반면하는 runloop에 추가되지 않습니다 initialiser와 타이머를 만드는 @ scheduledTimerWith...자동으로 현재 runloop에 추가 - 그래서 전혀 여기에는 이상한 행동은 없다)
데이비드 Ganster

1
@David 귀하의 제안에 감사드립니다. 오해가 STFW 또는 RTFA (Read The F ... ing API) 범주에 속하는 것 같아요?
코더

1
그것에 대해 걱정하지 마십시오, 아무도 모든 API의 모든 하나의 방법에 대한 설명서를 읽어 기대할 수 없다)
데이비드 Ganster

10

선택기는 Objective-C에서 메소드 이름의 내부 표현입니다. Objective-C에서 "@selector (methodName)"은 소스 코드 메소드를 SEL의 데이터 유형으로 변환합니다. Swift에서 @selector 구문을 사용할 수 없으므로 (rickster가 그 지점에 있음), 메소드 이름을 직접 String 객체로 지정하거나 String 객체를 Selector 유형으로 전달해야합니다. 예를 들면 다음과 같습니다.

var rightBarButton = UIBarButtonItem(
    title: "Logout", 
    style: UIBarButtonItemStyle.Plain, 
    target: self, 
    action:"logout"
)

또는

var rightBarButton = UIBarButtonItem(
    title: "Logout", 
    style: UIBarButtonItemStyle.Plain, 
    target: self, 
    action:Selector("logout")
)

8

Swift 4.1
탭 제스처 샘플

let gestureRecognizer = UITapGestureRecognizer()
self.view.addGestureRecognizer(gestureRecognizer)
gestureRecognizer.addTarget(self, action: #selector(self.dismiss(completion:)))

// Use destination 'Class Name' directly, if you selector (function) is not in same class.
//gestureRecognizer.addTarget(self, action: #selector(DestinationClass.dismiss(completion:)))


@objc func dismiss(completion: (() -> Void)?) {
      self.dismiss(animated: true, completion: completion)
}

Selector Expression 에 대한 자세한 내용은 Apple 문서를 참조하십시오.


이 작업을 중단하십시오. 아무도 도와주지 않습니다. 이것이 스위프트 3.1과 어떻게 다릅니 까? 그리고 이미 약 20 개의 답변이있을 때 다른 답변을 추가해야한다고 생각한 이유는 무엇입니까?
Fogmeister

스위프트 4에서는 호출 선택기가 다릅니다. 스위프트 4에서 이러한 답변을 시도하고 참조하십시오. 이것들은 편집하지 않고 작동하지 않습니다.
발기 부전

기존의 승인 된 답변을 편집 할 수없는 이유가 있습니까? 긴 답변 목록 끝에 추가하는 대신 실제로 유용하게 사용할 수 있습니다. "편집"버튼이 있습니다.
Fogmeister

또한 Swift 3과 다른 부분은 무엇입니까?
Fogmeister

2
Swift 4의 선택기에 objc 태그를 추가해야합니다. 정답입니다. 그리고 당신은 그들의 의미를 바꾸기 위해 다른 사람들의 대답을 편집해서는 안됩니다. @Krunal은 완전히 맞습니다.
Unome

6
// for swift 2.2
// version 1
buttton.addTarget(self, action: #selector(ViewController.tappedButton), forControlEvents: .TouchUpInside)
buttton.addTarget(self, action: #selector(ViewController.tappedButton2(_:)), forControlEvents: .TouchUpInside)

// version 2
buttton.addTarget(self, action: #selector(self.tappedButton), forControlEvents: .TouchUpInside)
buttton.addTarget(self, action: #selector(self.tappedButton2(_:)), forControlEvents: .TouchUpInside)

// version 3
buttton.addTarget(self, action: #selector(tappedButton), forControlEvents: .TouchUpInside)
buttton.addTarget(self, action: #selector(tappedButton2(_:)), forControlEvents: .TouchUpInside)

func tappedButton() {
  print("tapped")
}

func tappedButton2(sender: UIButton) {
  print("tapped 2")
}

// swift 3.x
button.addTarget(self, action: #selector(tappedButton(_:)), for: .touchUpInside)

func tappedButton(_ sender: UIButton) {
  // tapped
}

button.addTarget(self, action: #selector(tappedButton(_:_:)), for: .touchUpInside)

func tappedButton(_ sender: UIButton, _ event: UIEvent) {
  // tapped
}

Swift3 또는 Swift4에 대해 두세 개의 인수를 취하는 예제가 있다면 더 좋고 교육적 일 것입니다. 감사.
nyxee

5
Create Refresh control using Selector method.   
    var refreshCntrl : UIRefreshControl!
    refreshCntrl = UIRefreshControl()
    refreshCntrl.tintColor = UIColor.whiteColor()
    refreshCntrl.attributedTitle = NSAttributedString(string: "Please Wait...")
    refreshCntrl.addTarget(self, action:"refreshControlValueChanged", forControlEvents: UIControlEvents.ValueChanged)
    atableView.addSubview(refreshCntrl)

// 새로 고침 제어 방법

func refreshControlValueChanged(){
    atableView.reloadData()
    refreshCntrl.endRefreshing()

}

5

Swift 3.0이 공개되었으므로 targetAction을 적절하게 선언하는 것이 조금 더 미묘합니다.

class MyCustomView : UIView {

    func addTapGestureRecognizer() {

        // the "_" is important
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(MyCustomView.handleTapGesture(_:)))
        tapGestureRecognizer.numberOfTapsRequired = 1
        addGestureRecognizer(tapGestureRecognizer)
    }

    // since Swift 3.0 this "_" in the method implementation is very important to 
    // let the selector understand the targetAction
    func handleTapGesture(_ tapGesture : UITapGestureRecognizer) {

        if tapGesture.state == .ended {
            print("TapGesture detected")
        }
    }
}

4

사용할 때 performSelector()

/addtarget()/NStimer.scheduledTimerWithInterval() 메소드 (선택자와 일치)가로 표시되어야하는 메소드

@objc
For Swift 2.0:
    {  
        //...
        self.performSelector(“performMethod”, withObject: nil , afterDelay: 0.5)
        //...


    //...
    btnHome.addTarget(self, action: “buttonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
    //...

    //...
     NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector : “timerMethod”, userInfo: nil, repeats: false)
    //...

}

@objc private func performMethod() {}
@objc private func buttonPressed(sender:UIButton){.
}
@objc private func timerMethod () {.
}

Swift 2.2의 경우 문자열 및 선택기 이름 대신 '#selector ()'를 작성해야하므로 철자 오류 및 그로 인한 충돌이 더 이상 발생하지 않습니다. 아래는 예입니다

self.performSelector(#selector(MyClass.performMethod), withObject: nil , afterDelay: 0.5)

3

아래와 같이 선택기를 만듭니다.
1.

UIBarButtonItem(
    title: "Some Title",
    style: UIBarButtonItemStyle.Done,
    target: self,
    action: "flatButtonPressed"
)

2.

flatButton.addTarget(self, action: "flatButtonPressed:", forControlEvents: UIControlEvents.TouchUpInside)

@selector 구문이 사라지고 호출 할 메소드의 이름을 지정하는 간단한 문자열로 대체되었습니다. 자세한 내용에 동의 할 수있는 영역이 하나 있습니다. 물론, flatButtonPressed라는 대상 메소드가 있다고 선언했다면 다음과 같이 작성하는 것이 좋습니다.

func flatButtonPressed(sender: AnyObject) {
  NSLog("flatButtonPressed")
}

타이머를 설정하십시오.

    var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, 
                    target: self, 
                    selector: Selector("flatButtonPressed"), 
                    userInfo: userInfo, 
                    repeats: true)
    let mainLoop = NSRunLoop.mainRunLoop()  //1
    mainLoop.addTimer(timer, forMode: NSDefaultRunLoopMode) //2 this two line is optinal

완료하려면 다음은 flatButtonPressed입니다.

func flatButtonPressed(timer: NSTimer) {
}

" @selector 구문이 사라졌습니다. "에 대한 소스 있습니까?
winklerrr

3

이 답변 중 많은 부분이 도움이되는 것으로 나타 났지만 버튼이 아닌 것으로이 작업을 수행하는 방법은 명확하지 않습니다. UILabel에 제스처 인식기를 신속하게 추가하고 어려움을 겪고 있으므로 위의 모든 내용을 읽은 후 내가 찾은 것이 다음과 같습니다.

let tapRecognizer = UITapGestureRecognizer(
            target: self,
            action: "labelTapped:")

"선택기"가 다음과 같이 선언 된 경우 :

func labelTapped(sender: UILabel) { }

공개이며 Selector () 구문을 사용하지 않지만이 작업을 수행 할 수도 있습니다.

let tapRecognizer = UITapGestureRecognizer(
            target: self,
            action: Selector("labelTapped:"))

3

#selector 를 사용하면 컴파일 할 때 코드를 확인하여 호출하려는 메소드가 실제로 존재하는지 확인합니다. 더 좋은 방법은 존재하지 않으면 컴파일 오류가 발생하는 것입니다. Xcode는 앱 빌드를 거부하므로 가능한 다른 버그 소스를 잊어 버릴 수 없습니다.

override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.rightBarButtonItem =
            UIBarButtonItem(barButtonSystemItem: .Add, target: self,
                            action: #selector(addNewFireflyRefernce))
    }

    func addNewFireflyReference() {
        gratuitousReferences.append("Curse your sudden but inevitable betrayal!")
    }

2

작업을 트리거하는 컨트롤을 설정하는 위치를 확인하는 것이 유용 할 수 있습니다.

예를 들어, UIBarButtonItem을 설정할 때 viewDidLoad 내에 버튼을 작성해야하거나 그렇지 않으면 인식 할 수없는 선택기 예외가 발생한다는 것을 알았습니다.

override func viewDidLoad() {
    super.viewDidLoad() 

    // add button
    let addButton = UIBarButtonItem(image: UIImage(named: "746-plus-circle.png"), style: UIBarButtonItemStyle.Plain, target: self, action: Selector("addAction:"))
    self.navigationItem.rightBarButtonItem = addButton
}

func addAction(send: AnyObject?) {     
    NSLog("addAction")
}

1

선택기 구문을 호출하는 메소드에서 간단한 문자열 이름으로 변경

var timer1 : NSTimer? = nil
timer1= NSTimer(timeInterval: 0.1, target: self, selector: Selector("test"), userInfo: nil, repeats: true)

그런 다음 func test ()를 입력하십시오.


1

selector에서 단어 Objective-C세계는 당신은 그것을에서 사용할 수 있습니다 Swift호출에 대한 가능성을 가지고 Objective-C에서 Swift 그것은 당신이 런타임에 일부 코드를 실행할 수 있습니다

Swift 2.2구문이 하기 전에 :

Selector("foo:")

함수 이름이 Selector문자열 매개 변수 ( "foo")로 전달되므로 컴파일시 이름 을 확인할 수 없습니다 . 결과적으로 런타임 오류가 발생할 수 있습니다 .

unrecognized selector sent to instance

Swift 2.2+구문은 다음과 같습니다

#selector(foo(_:))

Xcode의 자동 완성 기능을 통해 올바른 메소드를 호출 할 수 있습니다.


0

스위프트 3

// 타이머를 만드는 샘플 코드

Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(updateTimer)), userInfo: nil, repeats: true)

WHERE
timeInterval:- Interval in which timer should fire like 1s, 10s, 100s etc. [Its value is in secs]
target:- function which pointed to class. So here I am pointing to current class.
selector:- function that will execute when timer fires.

func updateTimer(){
    //Implemetation 
} 

repeats:- true/false specifies that timer should call again n again.

0

스위프트 4의 선택기 :

button.addTarget(self, action: #selector(buttonTapped(sender:)), for: UIControlEvents.touchUpInside)

-1

신속한 3

let timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(self.test), userInfo: nil, repeats: true)

함수 선언 같은 클래스에서 :

@objc func test()
{
    // my function
} 

대상이 자체 인 경우 self선택기에 없어도 됩니다. 이것으로 충분합니다 :let timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(test), userInfo: nil, repeats: true)
Mithra Singam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.