30576


初心者ですみません。

今playground上で動くプログラムをswift2.1からswift3に書き換えていて、プログラムの指示通りに直していたのですが、  
あるテキストボックスを作り、上書き保存する場面でエラーが出ました。

[code]

    import Cocoa
    
    var Mill1 = "a8 ~ a16"
    
    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    
    let fileObject =  Mill1
    let fileName = "Mill crepe1.txt"
    let filePath = documentsPath + fileName
    
    do {
    try fileObject.write(toFile: filePath, atomically: true, encoding: String.Encoding.utf8)
    } catch {
    
    }
    
    let output = OutputStream(toFileAtPath: filePath, append: true)
    output?.open()
    let text = Mill1 + "\n"
    let cstring = text.cString(using: String.Encoding.utf8)
    let bytes = UnsafePointer<UInt8>(cstring!)
    let size = text.lengthOfBytes(using: String.Encoding.utf8)
    output?.write(bytes, maxLength: size)
    output?.close()
    
[/code]

この、下から４行目の  
let bytes = UnsafePointer(cstring!)  
の場所で、

[code]

    error: 'init' is unavailable: use 'withMemoryRebound(to:capacity:_)' to temporarily view memory as another layout-compatible type.
    
[/code]

のエラーが出ました。

翻訳すると、'init'は使用できないので'withMemoryRebound（to：capacity：_）'を使用して、メモリーを別のレイアウト互換タイプとして一時的に表示してくれとのことなのですが、  
別のレイアウト互換タイプとして表示するには具体的にどのようにすればいいのでしょうか？


CC BY-SA 3.0
2016-11-21T06:48:35.313
30570
2016-11-21T09:36:35.590
2016-11-21T09:24:42.273
19614
19614
question
swift3
swift3に移行時のOutputStreamでのバグを直したい


なかなか難解なエラーメッセージですが、エラーの原因は、 **型の不一致** にあります。  
`cstring`は、`CChar`型をメンバーとする配列（のOptional）で、それを`UnsafePointer<UInt8>`に変換するのは、型不一致になります。C言語、Objective-
Cだと、暗黙の型キャストをしてくれますが、Swiftはしてくれません。Swift3になって、よけいしてくれなくなった印象があります。

[code]

    let text = Mill1 + "\n"
    let cstring = text.cString(using: String.Encoding.utf8)
    let bytes = UnsafePointer<UInt8>(cstring!)
    
[/code]

この3行を、こう書き換えてください。

[code]

    let text = Mill1 + "\n"
    let tmps = [UInt8](text.utf8)
    let bytes = UnsafePointer<UInt8>(tmps)
    
[/code]

C言語の文字列（`cString`）を経由せずに、文字列を`UInt8`型の配列に、2行目で変換しています。


CC BY-SA 3.0
2016-11-21T09:36:35.590
30576
2016-11-21T09:36:35.590
18540
30570
answer