2016-09-16 6 views
3

に対応するタイプunsigned char*の配列であるNULL終了文字列を返すc apiがあります。Swift 3:ヌルで終了するUnsafePointer <UInt8>を文字列に変換します。

スウィフトはイニシャライザString(validatingUTF8:)を有するが、引数がUnsafePointer<CChar>(別名UnsafePointer<Int8>)でなければならないと、2つの間で変換する全く自明な方法は存在しません。

このNull終了C文字列をSwift文字列に変換するにはどうすればよいですか?スウィフト3、String

答えて

8

したがって、それは両方の符号付きおよび符号なしの文字の配列(NULLで終了する)から作成することができる2つの初期化子

public init(cString: UnsafePointer<CChar>) 
public init(cString: UnsafePointer<UInt8>) 

を有しています。したがって

let s = String(cString: yourCharPointer) 

はちょうどうまくいきます。


Stringが置換文字によってそれら を置き換えるのではなく、病気に形成されたUTF-8シーケンスにを失敗し、別の初期化子

public init?(validatingUTF8 cString: UnsafePointer<CChar>) 

を持っています。このinitメソッドには、符号なし文字をとる相手の はありません。

例としてCString.swiftで既存の実装を考えると、拡張としてこれを追加するには余りにも困難ではない。

extension String { 
    public init?(validatingUTF8 cString: UnsafePointer<UInt8>) { 
     guard let (s, _) = String.decodeCString(cString, as: UTF8.self, 
               repairingInvalidCodeUnits: false) else { 
      return nil 
     } 
     self = s 
    } 
} 

、次いで

if let s = String(validatingUTF8: yourCharPointer) { 
    print(s) 
} else { 
    print("invalid UTF-8") 
} 

も(NULLで終了する)配列と連動符号付き文字と符号なし文字の両方。

+0

ありがとうございます。私の自動完成品には表示されませんでした。 – AthanasiusOfAlex

関連する問題