在Swift中,“字面量字符串”与“字符串(String)”有何区别?

6

在使用Swift时,我发现了这个令人惊讶的事情:

"123".integerValue // <= returns 123

var x = "123"
x.integerValue     // <= Error: String does not have a member named integerValue

有人能解释一下吗?


看起来"123".integerValue正在将其桥接到NSString。 var x = "123"; (x as NSString).integerValue // <= 返回 123 - Malcolm Jarvis
@MalcolmJarvis 或者更详细一些:x.bridgeToObjectiveC().integerValue - Brian Nickel
4个回答

6

我的猜测是在第一个例子中,编译器使用对 integerValue 的调用作为额外的信息来推断类型(在NSString和Swift String之间进行选择)。

在第二个例子中,它可能默认为Swift String,因为它不评估多行。


此外,您可以显式地为变量 var x:NSString = "123" 指定类型以解决该问题。 - Austin
我得出了同样的结论。没有意识到像方法调用这样的事情会影响推断,但这很合理。谢谢! - gwcoffey

1
我认为这是类型推断的一个例子。当你执行:"123".integerValue时,编译器会检测到在这种情况下你想使用一个NSString对象(当你将字符串字面量用作 objective-c 函数的参数时,编译器也会这样做)。
一个类似的例子是:
// x is an Int
let x = 12

// here we tell the compiler that y is a Double explicitly
let y: Double  = 12

// z is a Double because 2.5 is a literal Double and so "12" is also
// parsed as a literal Double
let z = 12 * 2.5

1
使用 .toInt()
var x = "123"

var num: Int = x.toInt()

是的,我知道。我只是对我看到的结果感到惊讶。 - gwcoffey

0

如果你这样做:

var x = "123" as NSString
x.integerValue

var x : NSString = "123" // or this as Sulthan suggests

它不会显示那个错误。

我认为你的第一个例子自动选择使用NSString,因为只有这个.integerValue调用。

第二个例子可能失败是因为它没有被告知它是什么类型,所以决定使用Swift字符串。


var x: NSString = "123" 也许会更好。 - Sulthan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接