gpt4 book ai didi

c - 在可变参数列表中将 Swift 字符串作为 C 字符串传递

转载 作者:太空宇宙 更新时间:2023-11-04 03:29:10 25 4
gpt4 key购买 nike

我正在尝试使用旧的 printf 风格的字符串格式化程序从旧的 Swift 字符串定义新的 Swift 字符串。

我注意到只要我从 Swift 字符串文字而不是字符串变量开始,它就可以正常工作。

// OK!
String(format:"%s", "hello world".cStringUsingEncoding(NSUTF8StringEncoding))

// ERROR: argument type '[CChar]?' does not conform to expected type 'CVarArgType'
let s = "hello world"
String(format:"%s", s.cStringUsingEncoding(NSUTF8StringEncoding))

为什么会这样?

最好的解决方法是什么?

(请注意,我知道但不想使用 Cocoa 字符串格式化程序 %@。我想要 printf 样式的格式化代码,因为我实际上想做的是获取与 %-10s 之类的代码快速而肮脏的表格对齐。)

这个问题涉及 Swift 2.2。

最佳答案

不要仅仅为了对齐而创建 C 字符串。有一种方法stringByPaddingToLength为此。

// Swift 2
s.stringByPaddingToLength(10, withString: " ", startingAtIndex: 0)

// Swift 3
s.padding(toLength: 10, withPad: " ", startingAt: 0)

请注意,如果字符串超过 10 个 UTF-16 代码单元,它将被截断。


这里的问题是,Swift 中有两个名为 cStringUsingEncoding 的方法。 :

  1. func cStringUsingEncoding(encoding: UInt) -> UnsafePointer<Int8> , 作为 NSString 的一个方法
  2. func cStringUsingEncoding(encoding: NSStringEncoding) -> [CChar]? , 作为 String 的扩展

如果我们想要一个指针,我们需要确保我们使用的是 NSString,而不是 String。

在第一个示例中,字符串文字可以是 String 或 NSString,因此编译器选择 NSString,因为另一个不起作用。

但是在第二个例子中,s 的类型已设置为字符串,因此返回 [CChar]? 的方法被选中。

这可以通过强制 s 来解决。成为一个 NSString:

let s: NSString = "hello world"
String(format:"%s", s.cStringUsingEncoding(NSUTF8StringEncoding))

关于c - 在可变参数列表中将 Swift 字符串作为 C 字符串传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38510660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com