swift中的文字字符串与`String`

Posted

技术标签:

【中文标题】swift中的文字字符串与`String`【英文标题】:Literal String vs. `String` in swift 【发布时间】:2014-06-03 15:46:41 【问题描述】:

玩 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 // &lt;= returns 123 @MalcolmJarvis 或者更详细的:x.bridgeToObjectiveC().integerValue 【参考方案1】:

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

在第二个示例中,它可能默认为 Swift 字符串,因为它不会计算多行。

【讨论】:

要添加到此,您可以显式键入变量var x:NSString = "123" 来解决问题 我得出了同样的结论。没有意识到方法调用之类的东西会影响推理,但这是有道理的。谢谢!【参考方案2】:

我相信这是类型推断的一个例子。当您这样做时:"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

【讨论】:

【参考方案3】:

使用.toInt()

var x = "123"

var num: Int = x.toInt()

【讨论】:

是的,我知道。我只是对我看到的结果感到惊讶。【参考方案4】:

如果你这样做:

var x = "123" as NSString
x.integerValue

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

它不会显示该错误。

我认为您的第一个示例自动表明您想使用 NSString,因为 NSString 只有这个 .integerValue 调用。

第二个例子可能失败了,因为它没有被告知它是什么,而是决定使用 swift 字符串。

【讨论】:

var x : NSString = "123" 可能会更好

以上是关于swift中的文字字符串与`String`的主要内容,如果未能解决你的问题,请参考以下文章

字符串文字中的 Swift 特殊 Unicode 字符

字符串文字与整数中的C ++ constexpr vs宏

PURE Swift 中的十六进制字符串到字符

在 Xcode 7 Swift 2 中将字符串与数组分开以供 HTML 使用

Swift之字符串(String)

Swift3.0-字符串和字符