Swift中应该使用哪种类型?NSString还是String?
Swift中应该使用哪种类型?NSString还是String?
随着Swift的发布,我一直在努力理解这种新语言
我是一名iOS开发人员,会在应用程序中使用NSString,NSInteger,NSDictionary
等类型。我注意到在苹果公司的《Swift编程语言》电子书中,他们使用Swift类型String,Int,Dictionary
我注意到Swift类型没有(或者不同命名)一些Foundation类型的函数。例如,NSString
具有length
属性。但是我找不到类似于Swift String
的属性。
我在想,在iOS应用程序中,我是否仍然应该使用Foundation类型?
NSString:创建存在于堆中并始终通过引用传递的对象。
String:它是一个值类型,无论何时我们传递它,它都是按值传递的,
就像结构体和枚举一样,在Swift中,String本身就是一个结构体。
public struct String { // string implementation }
但是,当你第一次对它进行突变时,才会创建复制品。
字符串自动桥接到Objective-C作为NSString。如果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"
从重复值创建字符串:
let repeatingString = String(repeating:"123", count:2) // "123123"
在Swift 4中 - 字符串是字符的集合:
现在,String能够执行任何人能够在集合类型上执行的所有操作。
有关更多信息,请参阅Apple文档。
尽可能地使用Swift原生类型。语言已经针对它们做了优化,并且大部分功能在本地类型和Foundation类型之间进行了桥接。
虽然String
和NSString
在大多数情况下可以互换,即你可以将String
变量传递给接受NSString
参数的方法,反之亦然,但是某些方法似乎目前还没有自动桥接的能力。参见此答案,了解如何获取String的长度,以及此答案,讨论如何使用containsString()
来检查子字符串。 (免责声明:我是上述两个答案的作者)
我还没有完全探索其他数据类型,但我认为在Swift和NSNumber
中,类似上述内容的版本也会保持真实性。
每当您需要使用Foundation类型之一时,您可以将它们用于显式类型的变量/常量,如var str: NSString = "An NSString"
,或者在一个Swift类型的现有变量/常量上使用bridgeToObjectiveC()
,例如使用str.bridgeToObjectiveC().length
。您还可以使用str as NSString
将String
强制转换为NSString
。
然而,这类显式地使用Foundation类型的技术,或者至少其中一些,在未来可能会变得过时,因为 从语言参考中所述的情况来看,String
/ NSString
桥应该是完全无缝的。
有关该主题的全面讨论,请参阅使用Swift与Cocoa和Objective-C:处理Cocoa数据类型