Swift中的事件概念是否与C#中的事件类似?

Swift中的事件概念是否与C#中的事件类似?,swift,swift3,Swift,Swift3,我是从Java\C#背景开始学习Swift的,我想不出一件事。 是否有任何方法可以在类似于C#中的事件(操作)的Swift对象中创建通知事件 或者我应该为此使用闭包吗?据我所知,C#中的操作委托只是一个无效返回函数委托,它封装了一个可以通过委托执行的方法 由于Swift支持高阶函数,您可以定义自己的操作类型,其唯一目的是封装一个Void-返回方法,用于typeholder类型T的单个参数 struct Action<T> { private let f: (T) ->

我是从Java\C#背景开始学习Swift的,我想不出一件事。 是否有任何方法可以在类似于C#中的事件(
操作
)的Swift对象中创建通知事件


或者我应该为此使用闭包吗?

据我所知,C#中的
操作
委托只是一个
无效
返回函数委托,它封装了一个可以通过委托执行的方法

由于Swift支持高阶函数,您可以定义自己的
操作
类型,其唯一目的是封装一个
Void
-返回方法,用于typeholder类型T的单个参数

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

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

    func run(_ val: T) {
        f(val)
    }
}
现在,我不知道C#中
Action
的常见用例,但是如果您想在某个任务完成后使用它来执行某个事件,您可能只需要使用一个完成处理程序作为要执行的任务的结束:

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

您可以使用委托和协议来实现这一点。下面是一个简单的示例,假设您有一个故事板,其中包含两个名为ViewController和SecondViewController的ViewController(故事板id为“Main”)


正如其他人所说,swift中没有
事件
关键字。但是实现你的很容易

我已经做了一个符合这些要求的测试

这个函数非常简单,小于100 sloc

以下是一个简短的版本:

public class Event<T> {
    private var handlers:[EventHandler<T>] = []

    private init() {}

    private func invoke(sender:AnyObject?,value:T) -> Void {
        for handler in self.handlers {
             handler.handle(sender,value)
        }
    }

    public static func += ( event: Event, handler: EventHandler<T>) -> Void {
    {
         event.handlers.append(handler)
    }

    public static func -= ( event: Event, handler: EventHandler<T>) -> Void {
         event.handlers.removeAll{$0 === handler}
    }

    public static func create() -> (invoke:Delegate<T>,event:Event<T>){
         let res = Event<T>()
         return (res.invoke,res)
    }
}
委托

///needed as Swift doesn't allow func ===
public class EventHandler<T> {
     private var _handle:Delegate<T>

     public var handle:Delegate<T> {
          return self._handle
     }

     public init(handle:@escaping Delegate<T>){
          self._handle = handle
     }
}
public typealias Delegate<T> = (_ sender:AnyObject?,_ args:T) -> Void
publicTypeAlias委托=(\uSender:AnyObject?,\uArgs:T)->Void
使用asis:

let tmp = Event<String>.create()
var handler = EventHandler<String>(handle: { sender, args in
    print(args)
})
tmp.event += handler
tmp.invoke(self,"Hello world !")
//handler should print "Hello world !"
tmp.event -= handler
让tmp=Event.create()
var handler=EventHandler(句柄:{sender,args in
打印(args)
})
tmp.event+=处理程序
调用(self,“helloworld!”)
//处理程序应该打印“你好,世界!”
tmp.event-=处理程序
这个解决方案提供了与C#几乎相同的语法:
+=
-=
调用
,并防止
调用超出声明范围。

///needed as Swift doesn't allow func ===
public class EventHandler<T> {
     private var _handle:Delegate<T>

     public var handle:Delegate<T> {
          return self._handle
     }

     public init(handle:@escaping Delegate<T>){
          self._handle = handle
     }
}
public typealias Delegate<T> = (_ sender:AnyObject?,_ args:T) -> Void
let tmp = Event<String>.create()
var handler = EventHandler<String>(handle: { sender, args in
    print(args)
})
tmp.event += handler
tmp.invoke(self,"Hello world !")
//handler should print "Hello world !"
tmp.event -= handler