尝试在 Swift 操场上执行此操作时 Xcode 冻结?
Posted
技术标签:
【中文标题】尝试在 Swift 操场上执行此操作时 Xcode 冻结?【英文标题】:Xcode freezes when trying to execute this in a Swift playground? 【发布时间】:2014-08-07 10:32:14 【问题描述】:我只是在试验 Swift,所以我把它放在我的操场上:
// Playground - noun: a place where people can play
import Cocoa
func printCarInfo(car:Car?) -> Void
if let _car = car
println("This is a " + _car.make + " " + _car.model + " from \(_car.year). It's worth $" + _car.price + ".")
class Car
init(make:String, model:String, year:UInt, color:NSColor, price:UInt)
self.make = make
self.model = model
self.year = year
self.color = color
self.price = price
var make : String
var model : String
var year : UInt
var color : NSColor
var price : UInt
func isNewCar() -> Bool
let _formatter = NSDateFormatter()
_formatter.dateFormat = "yyyy"
let _currentYear = _formatter.stringFromDate(NSDate())
return (_currentYear == String(self.year))
let chevy = Car(make: "Chevrolet", model: "Camaro ZL1", year: 2014, color: NSColor.redColor(), price: 55355)
printCarInfo(chevy)
非常直接的代码,没有什么复杂的。但是 Xcode 不执行它。右下角的小加载指示器一直在旋转,我的 macbook 变热,风扇旋转,但什么也没发生。如果我将printCarInfo(car:Car?) -> Void
函数中的println
命令修改为如下内容:
println("Ok")
那就完全没问题了。但只要我把这条线放进去:
println("This is a " + _car.make + " " + _car.model + " from \(_car.year). It's worth $" + _car.price + ".")
Xcode 像我上面描述的那样冻结。我尝试保存游乐场并重新打开它,但每次都会发生同样的事情。
我认为代码没有任何问题。只是 Xcode 测试版中的一个错误吗?任何人都可以尝试将其粘贴到操场上,看看会发生什么? 这是一个 OS X 游乐场,我使用 Xcode beta 5。另外,我使用的是 10.10 DP5。
【问题讨论】:
【参考方案1】:绝对是 Xcode 中的一个错误。编译器在单行执行中连接超过 5 个字符串似乎存在问题。以下是我的分析:
目前您最多可以在单行执行中连接 5 或 6 个字符串(这不是一个功能,这是一个错误)。例如在 Playground 中试试这个:
var tstr = "A" + "B" + "C" + "D" + "E" + "F" + "G"
或
println("A" + "B" + "C" + "D" + "E" + "F");
此执行会挂起 Xcode,并将 Mac 的 CPU 使用率增加到 200%。
这是一个奇怪的事实。现在试试这个:
var tstr = "A" + "B" + "C" + "D" + "E"
tstr = tstr + "F" + "G"
println(tstr) //Correct output: ABCDEFG
所以这似乎是解决这个问题的方法。 断开和连接。
但是您的代码也有一个小错误。您正在连接 UInt
和一个字符串。 _car.price
属于 UInt
类型,您不能直接将其与字符串连接。所以要么使用字符串转换,要么使用字符串插值。以下是上述代码的工作方式:
使用 UInt 到 String 的转换
var str = "This is a " + _car.make + " "
str = str + _car.model + " from \(_car.year). It's worth $" + String(_car.price) + "."
println(str) //Prints: This is a Chevrolet Camaro ZL1 from 2014. It's worth $55355.
或
使用字符串插值
var str = "This is a " + _car.make + " "
str = str + _car.model + " from \(_car.year). It's worth $ \(_car.price)."
println(str)//Same output: This is a Chevrolet Camaro ZL1 from 2014. It's worth $55355.
【讨论】:
是的,这确实是一个错误。我确实尝试了您的示例,并且发生了同样的事情。_car.price
的那个错误只是一个偶然的错误,我没有注意到它,但感谢您指出:)
请随时提交雷达和欺骗 rdar://15933674【参考方案2】:
println("This is a \(car.make) \(car.model) from \(car.year). Itsworth \(car.price)")
【讨论】:
let chevy = Car(make: "Chevrolet",...)
确实首先创建一个对象。您的代码只是定义了一个变量,但 not 创建了一个对象。
@MartinR 是的,正确。以上是关于尝试在 Swift 操场上执行此操作时 Xcode 冻结?的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 操场上,我不小心按了一些键,现在无法打字……卡在“?”符号而不是光标
如何在操场上安装 3rd 方依赖项(如 Alamofire)