2017-01-03 71 views
0

我正在從Java \ C#背景進入Swift,無法弄清楚一件事。 有什麼辦法可以在類似於C#中的事件(Action<T>)的Swift對象中創建通知事件嗎?在Swift中是否有類似於C#中的事件的概念?

還是我想用瓶蓋用於此目的?

+0

[屬性觀察](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID262 ), 我猜。 – Moritz

回答

0

據我所知,C#中的Action<T>代表只是一個Void -returning函數委託,它封裝了一個可以通過代理執行的方法。

由於斯威夫特支持高階函數,你可以用封裝Void -returning方法爲typeholder類型T的一個參數的唯一目的定義自己的Action<T>

struct Action<T> { 
    private let f: (T) ->() 

    init(_ f: @escaping (T) ->()) { 
     self.f = f 
    } 

    func run(_ val: T) { 
     f(val) 
    } 
} 

我們可以利用這個例如封裝的函數:

func addOneAndPrint(val: Int) { 
    print(val+1) 
} 

let increaseAndPrintAction = Action(addOneAndPrint) // inferred to Action<Int> 
increaseAndPrintAction.run(1) //2 

或提供閉合(類似於C#提供一個lambda來Action<T>):

let increaseAndPrintAction = Action { print($0 + 1) } 
increaseAndPrintAction.run(1) // 2 
[1, 3, 5].forEach(increaseAndPrintAction.run) // 2 4 6 

現在,我不知道C#的Action<T>共同使用情況,但是如果你想在完成一些任務時使用它來執行一些事件,你可能希望簡單地使用一個完成處理程序作爲一個閉包提供給要執行的任務:

func increaseTask(_ val: inout Int, completion: (Int) ->()) { 
    val += 1 
    // ... 
    completion(val) 
} 

var val = 1 
increaseTask(&val) { print("Successfully increased to value \($0)") } 
    // Successfully increased to value 2 
print(val) // 2 
0

您可以使用委託人和協議執行此操作。這裏有一個簡單的例子,假設你有一個帶有2個ViewController的Storyboard,分別叫做ViewController和SecondViewController(故事板ID爲「Main」)。

protocol SampleProtocol: class { 
    func didLoad() 
    func didAppear() 
} 

class ViewController: UIViewController, SampleProtocol { 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     let secondViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondVC") as! SecondViewController 
     secondViewController.configure(delegate: self) 
     addChildViewController(secondViewController) 
     view.addSubview(secondViewController.view) 
    } 

    func didLoad() { 
     print ("didLoad") 
    } 

    func didAppear() { 
     print ("didAppear") 
    } 
} 

class SecondViewController: UIViewController { 
    weak var delegate: SampleProtocol? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     delegate?.didLoad() 
    } 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 

     delegate?.didAppear() 
    } 

    func configure(delegate: SampleProtocol) { 
     self.delegate = delegate 
    } 
} 
相關問題