2

我只是在试验 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 变热,风扇旋转,但什么也没发生。如果我将函数中的println命令修改为printCarInfo(car:Car?) -> Void如下所示:

println("Ok")

然后就完全好了。但只要我把这条线放进去:

println("This is a " + _car.make + " " + _car.model + " from \(_car.year). It's worth $" + _car.price + ".")

Xcode 像我上面描述的那样冻结。我尝试保存操场并重新打开它,但每次都会发生同样的事情。

我不认为代码有什么问题。只是 Xcode beta 中的一个错误吗?任何人都可以尝试将其粘贴到操场上,看看会发生什么?这是一个 OS X 游乐场,我使用 Xcode beta 5。另外,我使用的是 10.10 DP5。

4

2 回答 2

4

绝对是 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.priceUInt类型,您不能直接将其与字符串连接。所以要么使用字符串转换,要么使用字符串插值。以下是上述代码的工作方式:

使用 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.
于 2014-08-07T18:53:16.580 回答
1
 println("This is a \(car.make) \(car.model) from \(car.year). Itsworth \(car.price)")
于 2014-08-07T10:38:03.103 回答