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 .NSString
str as NSString
但是,这些技术明确使用Foundation类型或至少其中一些类型的必要性在将来可能已经过时,因为从语言参考中所述,例如String
/ NSString
bridge应该是完全无缝的.
有关该主题的详细讨论,请参阅使用Swift with Cocoa和Objective-C:使用Cocoa数据类型
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类型执行的所有操作.
有关更多信息,请参阅苹果文档.
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计算它的长度.
相似,是的,同样,不
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类提供的方法随时根据需要在两者之间进行转换.
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)
尽可能使用Swift本机类型.但是,对于String,您可以"无缝"访问所有NSString
类似的方法:
var greeting = "Hello!"
var len = (greeting as NSString).length
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
58532 次 |
最近记录: |