繁体   English   中英

Swift中使用协议的通用观察者模式给出分段错误

[英]Generic Observer Pattern in Swift using Protocols gives Segmentation Fault

import Foundation
class IProtocol {
     func meth1(arg: Int){}
}
class IObserver: IProtocol {
    private var className: String
    init(name: String) {
        className = name
    }
    override func meth1(arg: Int) {
        print(className, ":", arg)
    }
}
class Notifier<T> {
    private var listOfObservers = NSMutableArray()
    func addObserver(observer: T) {
        listOfObservers.add(observer)
    }
    func callObservers<ARG, RET>(function: (T)->(ARG)->RET, arg: ARG) {
        for obj in listOfObservers {
            let observer = obj as! T
            _ = function(observer)(arg)
        }
    }
}
let a = IObserver(name: "First I Observer")
let b = IObserver(name: "Second I Observer")
let n = Notifier<IProtocol>()
n.addObserver(observer: a)
n.addObserver(observer: b)
n.callObservers(function: IProtocol.meth1, arg: Int(1))

OUTPUT
首先我观察者:1
第二我观察者:1

上面的示例失败,并且由于命令失败而无法生成命令,因为信号:Segmentation Fault:11 ,当我将IProtocolclass更改为protocol时, 失败 我有不同的协议和确认这些协议的不同观察者类。 我正在尝试实现一个Notifier类,该类通过从协议中获取方法并为该方法传递参数来通知观察者。
如果有人可以解释我在做什么错,那将是很棒的!

我正在使用Swift 3Xcode 8.2

截至目前, Swift尚未处理对协议方法的直接引用

protocol IProtocol {
    func meth1()
}
class IObserver: IProtocol {
    func meth1() { print("success") }
}
let x = IProtocol.meth1 // This causes the compiler crash
x(IObserver())()

解决我的问题的方法是传递闭包而不是方法。 它是这样的:

import Foundation
protocol IProtocol {
    func meth1(arg: Int)
}
class IObserver: IProtocol {
    private var className: String
    init(name: String) {
        className = name
    }
    func meth1(arg: Int) {
        print(className, ":", arg)
    }
}
class Notifier<T> {
    private var listOfObservers = NSMutableArray()
    func addObserver(observer: T) {
        listOfObservers.add(observer)
    }
    func callObservers<ARG>(function: (T, ARG) -> (), arg: ARG) {
        for obj in listOfObservers {
            let observer = obj as! T
            function(observer, arg)
        }
    }
}
let a = IObserver(name: "First I Observer")
let b = IObserver(name: "Second I Observer")
let n = Notifier<IProtocol>()
n.addObserver(observer: a)
n.addObserver(observer: b)
n.callObservers(function: {obs, ar in
    obs.meth1(arg: ar)
}, arg: Int(1))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM