Swift - 使用哪种类型?NSString或String

Ale*_*lec 105 string macos objective-c ios swift

随着Swift的推出,我一直试图让我的头脑绕过新语言

我是iOS开发人员,会NSString, NSInteger, NSDictionary在应用程序中使用类型.我注意到在Apple的"The Swift Programming Language"电子书中,他们使用了Swift类型String, Int, Dictionary

我注意到Swift类型没有(或者命名不同)Foundation类型的一些功能.例如NSString有一个length属性.但我无法为Swift找到类似的String.

我想知道,对于iOS应用程序,我还应该使用基础类型吗?

Cez*_*zar 98

您应该尽可能使用Swift本机类型.该语言已经过优化以使用它们,并且大多数功能都在本机类型和Foundation类型之间进行桥接.

虽然String并且NSString大多数是可互换的,即,您可以将String变量传递给接受NSString参数的方法,反之亦然,但是到目前为止,某些方法似乎不会自动桥接.有关如何获取字符串长度的讨论,请参阅此答案,以及有关使用检查子字符串的讨论的答案containsString().(免责声明:我是这两个答案的作者)

我还没有完全探索其他数据类型,但我认为上面所述的某些版本也适用于Array/ NSArray,Dictionary/ NSDictionary和Swift中的各种数字类型NSNumber

每当您需要使用其中一种Foundation类型时,您可以使用它们显式地键入变量/常量,如在Swift类型的现有变量/常量中var str: NSString = "An NSString"使用或使用bridgeToObjectiveC()str.bridgeToObjectiveC().length,例如.你也可以通过使用String来转换为a .NSStringstr as NSString

但是,这些技术明确使用Foundation类型或至少其中一些类型的必要性在将来可能已经过时,因为从语言参考中所述,例如String/ NSStringbridge应该是完全无缝的.

有关该主题的详细讨论,请参阅使用Swift with Cocoa和Objective-C:使用Cocoa数据类型

  • +1引用`bridgeToObjectiveC()`并解释NSString和Swift的String之间的连接. (4认同)
  • 嘿cezar,我认为如果你想更新你的答案,bridgeToObjectiveC已被弃用. (2认同)

San*_*wat 25

NSString:创建驻留在堆中的对象,并始终通过引用传递.

String:每当我们传递它时它是一个值类型,它通过值传递.像Struct和Enum一样,String本身就是Swift中的一个Struct.

public struct String {
 // string implementation 
}
Run Code Online (Sandbox Code Playgroud)

但是当你通过时不会创建副本.它会在您第一次变异时创建副本.

String作为NSString自动桥接到Objective-C.如果Swift标准库没有,则需要导入Foundation框架以访问NSString定义的方法.

Swift String非常强大,它具有过多的内置函数.

字符串初始化:

var emptyString = ""             // Empty (Mutable)
let anotherString = String()     // empty String immutable    
let a = String(false)           // from boolean: "false"
let d = String(5.999)           //  "    Double "5.99"
let e = String(555)             //  "     Int "555"
// New in Swift 4.2 
let hexString = String(278, radix: 18, uppercase: true) // "F8"
Run Code Online (Sandbox Code Playgroud)

从重复值创建String:

 let repeatingString = String(repeating:"123", count:2) // "123123"
Run Code Online (Sandbox Code Playgroud)

在Swift 4中 - >字符串是字符集:

现在String能够执行任何人都可以对Collection类型执行的所有操作.

有关更多信息,请参阅苹果文档.

  • 这个答案应该得到更多的投票.这是String和NSString之间的根本区别.在其他任何地方,它们几乎可以互换 (2认同)

Ema*_*uel 12

你最好的选择是使用Swift原生类型和类,因为其他一些人已经注意到NSString有免费的字符串翻译,但是,它们不是100%相同,例如以下

var nsstring: NSString = "\U0001F496"
var string: String = "\U0001F496"

nsstring.length
count(string)
Run Code Online (Sandbox Code Playgroud)

你需要使用方法count()来计算字符串中的字符,还要注意nsstring.length返回2,因为它根据UTF16计算它的长度.

相似,是的,同样,不


Gab*_*lla 7

String并且NSString是可以互换的,所以你使用哪一个并不重要.你总是可以在两者之间施放

let s = "hello" as NSString
Run Code Online (Sandbox Code Playgroud)

甚至

let s: NSString  = "hello"
Run Code Online (Sandbox Code Playgroud)

NSInteger只是一个int或一个别名long(取决于架构),所以我只是使用Int.

NSDictionary是另一回事,因为它Dictionary是一个完全独立的实现.

一般来说,只要有可能,我就会坚持使用快速类型,并且您可以使用bridgeToObjectiveC()swift类提供的方法随时根据需要在两者之间进行转换.


Jia*_*aro 6

由于目标C类型仍然是动态调度的,因此它们可能会变慢.除非你需要与objective-c API进行交互,否则我会说你最好使用Swift原生类型


Fan*_*ing 6

斯威夫特 4 更新

String 在 swift 4 中得到修订。现在你可以直接调用 count 并将字素簇视为 1 个部分,就像一个表情符号。NSString 未更新,并以另一种方式对其进行计数。

var nsstring: NSString = "???"
var string: String = "???"

print(nsstring.length) // 11
print(string.count)    // 1
Run Code Online (Sandbox Code Playgroud)


Nat*_*ook 5

尽可能使用Swift本机类型.但是,对于String,您可以"无缝"访问所有NSString类似的方法:

var greeting = "Hello!"
var len = (greeting as NSString).length
Run Code Online (Sandbox Code Playgroud)