尝试在 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 操场上,我不小心按了一些键,现在无法打字……卡在“?”符号而不是光标

在 swift 3 操场上阅读 plist

加载时Swift改变图像的颜色

如何在操场上安装 3rd 方依赖项(如 Alamofire)

在 NSObject 的子类上实现啥方法以允许在 swift 操场上进行漂亮的打印?

Swift 操场结果错误的位置