【发布时间】:2015-06-18 21:34:07
【问题描述】:
扩展 Bool 让我兴奋不已,我认为在 Swift 中扩展闭包会很有趣(我们在 Smalltalk 中完全没有大惊小怪,为什么不呢?)。
这是我的游乐场:
typealias NiladicClosure = () -> ()
extension NiladicClosure {
var theAnswerToLife:Int {
return 42
}
}
let block:NiladicClosure = {}
block.theAnswerToLife
不行,说NiladicClosure does not have a member named 'theAnswerToLife'。查看控制台,我得到了更多信息:
Playground execution failed: /var/folders/2k/6y8rslzn1m95gjpg534j7v8jzr03tz/T/./lldb/33726/playground119.swift:3:1: error: non-nominal type 'NiladicClosure' cannot be extended
extension NiladicClosure {
^ ~~~~~~~~~~~~~~
什么是non-nominal type?有模式/解决方法吗?
其他类似问题早于 Swift 2,也足够具体,以至于人们为特定扩展提供了解决方法。我对 Swift 闭包是否是我可以添加其他行为的一流对象感兴趣,就像 Swift 中的其他东西一样。
【问题讨论】:
-
你不能扩展闭包。比较stackoverflow.com/questions/28317625/…(这是关于扩展元组,但同样的答案适用于函数/闭包)。
-
知道 WHY 元组和闭包不可扩展吗?在闭包的情况下,是因为闭包实际上从未用实际对象(或结构)具体化吗? (至少,我看不到他们在哪里)
-
@TravisGriggs 这是“mostly an implementation limitation”。