String.init(validatingUTF8:)
是一种来自SWIFT标准库的方法,实现在CString.swift:
public init?(validatingUTF8 cString: UnsafePointer<CChar>) {
let len = UTF8._nullCodeUnitOffset(in: cString)
guard let str = cString.withMemoryRebound(to: UInt8.self, capacity: len, {
String._tryFromUTF8(UnsafeBufferPointer(start: $0, count: len))
})
else { return nil }
self = str
}
String.init(utf8String:)
在NSStringAPI.swift:
/// Creates a string by copying the data from a given
/// C array of UTF8-encoded bytes.
public init?(utf8String bytes: UnsafePointer<CChar>) {
if let str = String(validatingUTF8: bytes) {
self = str
return
}
if let ns = NSString(utf8String: bytes) {
self = String._unconditionallyBridgeFromObjectiveC(ns)
} else {
return nil
}
}
是Foundation NSString
初始化式的SWIFT覆盖
- (nullable instancetype)initWithUTF8String:(const char *)nullTerminatedCString
它又在swift-corelibs-foundation/Sources/Foundation/NSString.swift个版本中实现了非苹果平台
public convenience init?(utf8String nullTerminatedCString: UnsafePointer<Int8>) {
guard let str = String(validatingUTF8: nullTerminatedCString) else { return nil }
self.init(str)
}
因此,这两种方法在转换C字符串的方式上没有区别,但是String.init(utf8String:)
需要import Foundation
,而String.init(validatingUTF8:)
不需要额外的导入.