Xcode Playground代码无法完整运行,Exercise协议扩展是否有误?
问题分析与解决方案
嘿,我来帮你捋一捋这个问题~
首先明确:你的第二个Exercise协议扩展本身没有语法问题。因为Exercise继承了CustomStringConvertible协议,要求实现description属性,而通过协议扩展提供默认实现是Swift完全允许的操作——这样所有遵循Exercise的类型,只要不自定义description,都会自动使用这个默认实现,完全合法。
那为什么Xcode Playground运行到第二个扩展时,运行按钮会变灰呢?原因其实出在Playground的特性上:Playground需要有实际的可执行逻辑(比如创建实例、调用属性、打印内容等),如果只有协议、扩展这类声明性代码,没有任何要执行的语句,Playground就没有可以运行的内容,所以运行按钮会变成灰色。
你提到运行到第14行(第一个扩展结束)时按钮还能正常执行,大概率是那时候Playground还在处理代码结构的解析,而当第二个扩展写完后,依然没有添加任何执行代码,就触发了这个“无内容可运行”的状态。
解决方法
只需要添加一个遵循Exercise协议的具体类型,再创建实例并执行一些操作,Playground的运行按钮就会恢复正常。比如在你的代码末尾加上这段:
// 定义一个遵循Exercise协议的具体类型 struct Running: Exercise { let name = "Running" let caloriesBurned: Double let minutes: Double } // 创建实例并测试属性 let morningRun = Running(caloriesBurned: 300, minutes: 30) print(morningRun.caloriesBurnedPerMinute) // 输出 10.0 print(morningRun) // 输出 Exercise(Running, burned 300.0 calories in 30.0 minutes)
另外提个小建议:你可以把两个Exercise的扩展合并成一个,代码会更整洁,当然分开写也完全没问题,只是风格差异:
extension Exercise { var caloriesBurnedPerMinute: Double { return caloriesBurned / minutes } var description: String { return "Exercise(\(name), burned \(caloriesBurned) calories in \(minutes) minutes)" } }
内容的提问来源于stack exchange,提问作者qsmy
相关产品推荐
相关产品推荐

