swift c语言 字符串的长度,在 Swift 中截取 C 字符串

本文探讨了Swift中字符串处理的变化,以及如何通过扩展简化子字符串的截取。作者分享了一段用于获取Git修订版本的代码,并展示了如何使用自定义扩展来提供更友好的语法。文章强调了Swift在字符串操作上的发展,以及如何利用扩展来增强已有类的功能。
摘要由CSDN通过智能技术生成

作者:Joe,Cee

Swift 中的字符串处理一直都在变化,一直不断发展。在研究 Swift 中某些字符串执行操作的演变过程中,我注意到了 Joel Spolsky 十几年前写的这个回答变得毫无用处。

下面的代码无法正常工作,但是如果可以,那真是极好的:

var helloWorld = "Hello, world!"

let hello = helloWorld[0...4]

print(hello)

我的意思是,既然 Python 可以这样用:hello = helloWorld[0:5],为什么在 Swift 中不可以这样用呢?

就像我们说的,Swift 2 很认真地听取了 Joel 在 2003 年提出的那些建议,我们所有人都(痛苦地)发现字符串完全变样了。mikeash.com 很好地总结了这些变化,因此对我来说,没有必要再去比较字符 (Character) 和字母 (Grapheme) 的区别。而当我「了解」到这点后,毫无疑问加重了我的记忆量。为了从一个(我已经知道)ASCII 编码的 const char* C 语言风格字符串中截取子串,我需要努力记住那些需要调用的黑科技代码。因此,我不会费心费力地去记这些东西,而是把它们写在这里,不仅是为了我,也是为了大家。

简单的子串示例

我一直在寻找一种方法,能够在我的 Day-to-day Linux 任务中加入更多的 Swift 编程机会。我认为这是使用快速脚本 (quick script) 和面向 DevOps 的任务来替代 语言 的绝佳机会。在这种情况下,我希望有一个快捷的方法能够打印出一个 Swift 开源项目的所有 git 修订版本 (revision),下面是我的代码:

import Glibc

func getGitRevision(dirname:String) -> String {

let BUFSIZE = 128

let cwd = String.fromCString(getcwd(nil, 0))!

var rc = chdir(dirname)

guard rc == 0 else {

return "ERROR"

}

var rev = ""

let pipe = popen("/usr/bin/git rev-parse HEAD", "r")

var buf = [CChar](count:BUFSIZE, repeatedValue:CChar(0))

while fgets(&buf, Int32(BUFSIZE), pipe) != nil {

rev = String.fromCString(buf)!

}

rev = rev[rev.startIndex...rev.startIndex.advancedBy(9)]

chdir(cwd)

return rev

}

let dirs = ["swift", "llvm", "clang", "lldb", "cmark", "llbuild", "swiftpm", "swift-corelibs-xctest", "swift-corelibs-foundation", "swift-integration-tests"]

for dir in dirs {

let rev = getGitRevision(dir)

print("\(dir):\(rev)")

}

我用 rev = rev[rev.startIndex...rev.startIndex.advancedBy(9)] 来获取 Git 修订版本哈希值的前 10 个字符,这实在是太啰嗦了,但是如果你正在处理的是 C 语言风格的字符串,那它可以很好地完成任务。

扩展

幸运的是,Swift 支持扩展,这个绝佳的特性允许你向不是你写的、并且无法访问源代码的类中添加一些方法。很多人在 Gist 上发布了类似的扩展代码,给访问子字符串添加一个小小的语法糖:

extension String {

subscript (r: Range) -> String {

get {

let startIndex = self.startIndex.advancedBy(r.startIndex)

let endIndex = self.startIndex.advancedBy(r.endIndex)

return self[Range(start: startIndex, end: endIndex)]

}

}

}

通过我们的扩展,我们就可以这样写:

let helloWorld = "Hello, world!"

var hello = helloWorld[0...4]

print(hello)

生活变得无比美好,不是么?

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值