Delegates in swift?

前端 未结 12 1320
天命终不由人
天命终不由人 2020-11-22 03:27

How does one go about making a delegate, i.e. NSUserNotificationCenterDelegate in swift?

相关标签:
12条回答
  • 2020-11-22 03:59

    It is not that different from obj-c. First, you have to specify the protocol in your class declaration, like following:

    class MyClass: NSUserNotificationCenterDelegate
    

    The implementation will look like following:

    // NSUserNotificationCenterDelegate implementation
    func userNotificationCenter(center: NSUserNotificationCenter, didDeliverNotification notification: NSUserNotification) {
        //implementation
    }
    
    func userNotificationCenter(center: NSUserNotificationCenter, didActivateNotification notification: NSUserNotification) {
        //implementation
    }
    
    func userNotificationCenter(center: NSUserNotificationCenter, shouldPresentNotification notification: NSUserNotification) -> Bool {
        //implementation
        return true
    }
    

    Of course, you have to set the delegate. For example:

    NSUserNotificationCenter.defaultUserNotificationCenter().delegate = self;
    
    0 讨论(0)
  • 2020-11-22 04:03

    Simple Example:

    protocol Work: class {
        func doSomething()
    }
    
    class Manager {
        weak var delegate: Work?
        func passAlong() {
            delegate?.doSomething()
        }
    }
    
    class Employee: Work {
        func doSomething() {
            print("Working on it")
        }
    }
    
    let manager = Manager()
    let developer = Employee()
    manager.delegate = developer
    manager.passAlong() // PRINTS: Working on it
    
    0 讨论(0)
  • 2020-11-22 04:07

    DELEGATES IN SWIFT 2

    I am explaining with example of Delegate with two viewControllers.In this case, SecondVC Object is sending data back to first View Controller.

    Class with Protocol Declaration

    protocol  getDataDelegate  {
        func getDataFromAnotherVC(temp: String)
    }
    
    
    import UIKit
    class SecondVC: UIViewController {
    
        var delegateCustom : getDataDelegate?
        override func viewDidLoad() {
            super.viewDidLoad()
         }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
        @IBAction func backToMainVC(sender: AnyObject) {
          //calling method defined in first View Controller with Object  
          self.delegateCustom?.getDataFromAnotherVC("I am sending data from second controller to first view controller.Its my first delegate example. I am done with custom delegates.")
            self.navigationController?.popViewControllerAnimated(true)
        }
    
    }
    

    In First ViewController Protocol conforming is done here:

    class ViewController: UIViewController, getDataDelegate
    

    Protocol method definition in First View Controller(ViewController)

    func getDataFromAnotherVC(temp : String)
    {
      // dataString from SecondVC
       lblForData.text = dataString
    }
    

    During push the SecondVC from First View Controller (ViewController)

    let objectPush = SecondVC()
    objectPush.delegateCustom = self
    self.navigationController.pushViewController(objectPush, animated: true)
    
    0 讨论(0)
  • 2020-11-22 04:08

    First class:

    protocol NetworkServiceDelegate: class {
    
        func didCompleteRequest(result: String)
    }
    
    
    class NetworkService: NSObject {
    
        weak var delegate: NetworkServiceDelegate?
    
        func fetchDataFromURL(url : String) {
            delegate?.didCompleteRequest(url)
        }
    }
    

    Second class:

    class ViewController: UIViewController, NetworkServiceDelegate {
    
        let network = NetworkService()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            network.delegate = self
            network.fetchDataFromURL("Success!")
        }
    
    
    
        func didCompleteRequest(result: String) {
            print(result)
        }
    
    
    }
    
    0 讨论(0)
  • 2020-11-22 04:08

    The solutions above seemed a little coupled and at the same time avoid reuse the same protocol in other controllers, that's why I've come with the solution that is more strong typed using generic type-erasure.

    @noreturn public func notImplemented(){
        fatalError("not implemented yet")
    }
    
    
    public protocol DataChangedProtocol: class{
        typealias DataType
    
        func onChange(t:DataType)
    }
    
    class AbstractDataChangedWrapper<DataType> : DataChangedProtocol{
    
        func onChange(t: DataType) {
            notImplemented()
        }
    }
    
    
    class AnyDataChangedWrapper<T: DataChangedProtocol> : AbstractDataChangedWrapper<T.DataType>{
    
        var base: T
    
        init(_ base: T ){
            self.base = base
        }
    
        override func onChange(t: T.DataType) {
            base.onChange(t)
        }
    }
    
    
    class AnyDataChangedProtocol<DataType> : DataChangedProtocol{
    
        var base: AbstractDataChangedWrapper<DataType>
    
        init<S: DataChangedProtocol where S.DataType == DataType>(_ s: S){
            self.base = AnyDataChangedWrapper(s)
        }
    
        func onChange(t: DataType) {
            base.onChange(t)
        }
    }
    
    
    
    class Source : DataChangedProtocol {
        func onChange(data: String) {
            print( "got new value \(data)" )
        }
    }
    
    
    class Target {
        var delegate: AnyDataChangedProtocol<String>?
    
        func reportChange(data:String ){
            delegate?.onChange(data)
        }
    }
    
    
    var source = Source()
    var target = Target()
    
    target.delegate = AnyDataChangedProtocol(source)
    target.reportChange("newValue")    
    

    output: got new value newValue

    0 讨论(0)
  • 2020-11-22 04:14

    In swift 4.0

    Create a delegate on class that need to send some data or provide some functionality to other classes

    Like

    protocol GetGameStatus {
        var score: score { get }
        func getPlayerDetails()
    }
    

    After that in the class that going to confirm to this delegate

    class SnakesAndLadders: GetGameStatus {
        func getPlayerDetails() {
    
     }
    }
    
    0 讨论(0)
提交回复
热议问题