26561


`nil`と`NULL`に関してSwiftではどのように考えたらいいか教えてください。

Objective-Cでは

`nil` = オブジェクトが空  
`NULL` = ポインタが空

という意味合いで使い分けていました。

しかしSwiftでは`NULL`と相対するものはないという事で、以下のサイトの`NULL`をどう書き換えればいいかで詰まっています。

<http://internetcom.jp/developer/20100406/26.html>

[code]

    + (void)getStreamsToHostNamed:(NSString *)hostName 
                             port:(NSInteger)port 
                      inputStream:(NSInputStream **)inputStreamPtr 
                     outputStream:(NSOutputStream **)outputStreamPtr
    {
        CFReadStreamRef     readStream;
        CFWriteStreamRef    writeStream;
    
        assert(hostName != nil);
        assert( (port > 0) && (port < 65536) );
        assert( (inputStreamPtr != NULL) || (outputStreamPtr != NULL) );
    
        readStream = NULL;
        writeStream = NULL;
    
        CFStreamCreatePairWithSocketToHost(
                                       NULL, 
                                       (CFStringRef) hostName, 
                                       port, 
                                       ((inputStreamPtr  != nil) ? &readStream : NULL),
                                       ((outputStreamPtr != nil) ? &writeStream : NULL)
                                       );
    
        if (inputStreamPtr != NULL) {
            *inputStreamPtr  = [NSMakeCollectable(readStream) autorelease];
        }
        if (outputStreamPtr != NULL) {
            *outputStreamPtr = [NSMakeCollectable(writeStream) autorelease];
        }
    }
    
[/code]

NULL == nilに置き換えて考えていいという事ではありませんよね？  
unsafePointerなどを使って書いていくのでしょうか？


CC BY-SA 3.0
2016-06-08T04:59:14.463
26552
2016-06-09T12:34:30.170
2016-06-08T08:15:04.133
5519
14782
question
swift ios swift2
Objective-CからSwiftに書き換える場合のNULLの扱い方とは？


まず、Objective-
Cにおいて、`NULL`と`nil`はどちらも単なる`0`という値になるだけなので、使い分けることには見た目が変わる以外には特に意味はありません。

Swiftでは`nil`は`Optional`として扱われるようになったので、Objective-
Cの時とは若干異なりますが、質問のコードの場合は、`nil`と`NULL`がどうこうというよりは、Cレイヤーの型をSwiftでどう扱えばいいかわからない、ということだと思いますので、ほぼ１対１でSwift書き換えたコードを提示します。参考にしてください。

要点は、CoreFoundationのほとんどのオブジェクトは`Unmanaged`でラップする必要があることと、ダブルポインタを渡しているところはSwiftでは`inout`パラメータを使う、ところかと思います。ただし、後者については、Swiftではタプルで返すなど、複数の戻り値を扱う方法がありますので、`inout`を使うようにもわかりやすい方法はあると思います。

[code]

    func getStreamsTo(hostName: String,
                      port: Int,
                      inout inputStream: NSInputStream?,
                            inout outputStream: NSOutputStream?) {
        var readStream:  Unmanaged<CFReadStream>?
        var writeStream: Unmanaged<CFWriteStream>?
    
        assert(port > 0 && port < 65536)
    
        CFStreamCreatePairWithSocketToHost(nil, hostName, UInt32(port), &readStream, &writeStream)
    
        if let readStream = readStream {
            inputStream = readStream.takeRetainedValue()
        }
        if let writeStream = writeStream {
            outputStream = writeStream.takeRetainedValue()
        }
    }
    
[/code]

使い方は以下のようにします。

[code]

    var inputStream: NSInputStream?
    var outputStream: NSOutputStream?
    getStreamsTo(hostname, port: port, inputStream: &inputStream, outputStream: &outputStream)
    
[/code]


CC BY-SA 3.0
2016-06-08T08:24:20.603
26561
2016-06-09T12:34:30.170
2016-06-09T12:34:30.170
5519
5519
26552
answer