Swift – 使用哪种types? NSString或String

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

我是一个iOS开发人员,将在应用程序中使用types,如NSString, NSInteger, NSDictionary 。 我注意到在Apple的“The Swift Programming Language”电子书中,他们使用Swifttypes的String, Int, Dictionary

我注意到Swifttypes没有(或不同地命名)一些基础types的function。 例如NSString有一个length属性。 但我一直无法find一个类似的Swift String

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

您应该尽可能使用Swift本机types。 该语言经过优化,可以使用它们,大部分function都在本地types和Foundationtypes之间桥接。

虽然StringNSString大部分是可以互换的,也就是说,你可以将Stringvariables传递给带有NSString参数的方法,反之亦然,有些方法似乎不会自动桥接到这一刻。 看到这个答案的关于如何获得一个string的长度的讨论, 这个答案讨论使用containsString()来检查子string。 (免责声明:我是这两个答案的作者)

我还没有完全探索其他的数据types,但我认为上述的一些版本也适用于Array / NSArrayDictionary / NSDictionary ,以及Swift和NSNumber的各种数字types

无论何时需要使用基础types,您都可以使用它们来显式键入variables/常量,例如在var str: NSString = "An NSString"或者对Swifttypes的现有variables/常量使用bridgeToObjectiveC()如在str.bridgeToObjectiveC().length为例。 你也可以使用str as NSString来将一个String为一个str as NSString

但是,这些技术显式使用基础types或者至less其中一些的必要性可能在将来已经过时,因为从语言引用中所述的例如String / NSString桥应该是完全的无缝。

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

你最好的select就是使用Swift本地types和类,就像其他人注意到的那样,NSString有免费的string转换,然而,它们不是100%相同的,例如下面的例子

 var nsstring: NSString = "\U0001F496" var string: String = "\U0001F496" nsstring.length count(string) 

您需要使用count()方法计算string中的字符,同时请注意,nsstring.length返回2,因为它基于UTF16计算其长度。

类似的,是的一样,没有

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

 let s = "hello" as NSString 

甚至

 let s: NSString = "hello" 

NSInteger只是一个intlong的别名(取决于体系结构),所以我只是使用Int

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

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

NSString:创build驻留在堆中的对象,并始终按引用传递。

string:它是一个值types,只要我们通过它,它的价值传递。 像Struct和Enum。 但是通过时不会创build副本。 当你第一次改变它时,它会创build副本。 欲了解更多信息,请参阅苹果文件

由于目标Ctypes仍然是dynamic调度,所以它们可能会变慢。 我会说你最好使用Swift本地types,除非你需要与Objective-C API交互

尽可能使用Swift本地types。 然而,在String的情况下,你可以像这样“无缝”地访问所有的NSString方法:

 var greeting = "Hello!" var len = (greeting as NSString).length 

Swift 4更新

string在swift 4中得到了修正。现在你可以直接调用它,并且认为字形集群是1个,就像是一个表情符号。 NSString不更新,并以另一种方式计数。

 var nsstring: NSString = "👩‍👩‍👧‍👦" var string: String = "👩‍👩‍👧‍👦" print(nsstring.length) // 11 print(string.count) // 1