2016-01-21 32 views
0

我正在阅读MirrorType在nshipster,并试图采用它的代码Swift 2.1。一切正常,直到我试图定制的_MirrorType有:无法暗示_Reflectable协议

extension WWDCSession : _Reflectable { 
    func _getMirror() -> _MirrorType { 
     return WWDCSessionMirror(self) 
    } 
} 

时出现错误:

error: Playground execution aborted: Execution was interrupted, reason: EXC_BAD_ACCESS (code=2, address=0x7fff58273e87).

而且我发现,这是因为在WWDCSessionMirrorinit方法被称为无限次。

struct WWDCSessionMirror: _MirrorType { 
private let _value: WWDCSession 

init(_ value: WWDCSession) { 
    _value = value 
} 

var value: Any { return _value } 

var valueType: Any.Type { return WWDCSession.self } 

var objectIdentifier: ObjectIdentifier? { return nil } 

var disposition: _MirrorDisposition { return .Struct } 

var count: Int { return 4 } 

subscript(index: Int) -> (String, _MirrorType) { 
    switch index { 
    case 0: 
     return ("number", _reflect(_value.number)) 
    case 1: 
     return ("title", _reflect(_value.title)) 
    case 2: 
     return ("track", _reflect(_value.track)) 
    case 3: 
     return ("summary", _reflect(_value.summary)) 
    default: 
     fatalError("Index out of range") 
    } 
} 

var summary: String { 
    return "WWDCSession \(_value.number) [\(_value.track.rawValue)]: \(_value.title)" 
} 

var quickLookObject: PlaygroundQuickLook? { 
    print(summary) 
    return .Text(summary) 
} 
} 

我想问为什么发生了,以及如何解决它?

回答

3

_Reflectable和_MirrorType不是你正在寻找的机器人。

它们是传统类型,它们已被CustomReflectable取代(等等)。 2015年WWDC关于LLDB的会议对此进行了一些详细说明(免责声明:我是该会议该部分的发言人,因此所有利益冲突:-)

但是,无论如何,您遇到的问题是因为这行:

_value = value 

既然你键入此行的操场上,告诉操场逻辑来捕捉显示(“登录”,在操场上的说法)你指派的事情。为此,操场使用附属于该类型的镜子。所以,我们走下车,并创建一个,这使我们再次运行

_value = value 

,它告诉操场逻辑记录值,然后意味着我们创建镜像,...

你首先应该的所有检查是否可以采用镜像和CustomReflectable而不是_MirrorType,并且如果使用这些API修复了您的问题。如果它没有可能的解决方法是将反射支持代码放在辅助源文件中,这会导致游乐场逻辑不在其内部记录东西。