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和Foundation
types之间桥接。
虽然String
和NSString
大部分是可以互换的,也就是说,你可以将String
variables传递给带有NSString
参数的方法,反之亦然,有些方法似乎不会自动桥接到这一刻。 看到这个答案的关于如何获得一个string的长度的讨论, 这个答案讨论使用containsString()
来检查子string。 (免责声明:我是这两个答案的作者)
我还没有完全探索其他的数据types,但我认为上述的一些版本也适用于Array
/ NSArray
, Dictionary
/ 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计算其长度。
类似的,是的一样,没有
String
和NSString
是可以互换的,所以你使用哪一个并不重要。 你总是可以在两者之间施放,使用
let s = "hello" as NSString
甚至
let s: NSString = "hello"
NSInteger
只是一个int
或long
的别名(取决于体系结构),所以我只是使用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