32306


swiftからC言語の関数を使用するときに、ポインタ型の引数、戻り値がある場合、  
インターフェイスは、有値オプショナル型となっていますが、なぜでしょうか？

例えば、次の関数のようなことです。

[code]

    func time(_: UnsafeMutablePointer<time_t>!) -> time_t
    func localtime_r(_: UNsafePointer<time_t>!, _: UnsafeMutablePointer<tm>!)->UnsafeMutablePointer<tm>!
    
[/code]

例えば、time関数は、引き数にnilを与えることができます。  
オプショナル型なので当たり前ですが。。。  
だったら、標準のオプショナル型の方が理屈に合いそうです。

[code]

    var current = time(nil)
    
[/code]

また、localtime_r関数の戻り値は、有値オプショナル型ですが、  
受け側としては、標準的なオプショナル型または、非オプショナル型で受けれると思いますが、  
有値オプショナル型が戻り値なので、非オプショナル型で受け取っても安全だと言いたいのでしょうか。それだと、time関数の引数はの意味は？？？

なぜ、C言語関数のポインタに対する型が、標準のオプショナル型が使用されないのかを教えてください。


CC BY-SA 3.0
2017-02-01T09:03:10.977
32303
2017-02-01T23:56:35.973
11148
question
swift swift3
C言語関数のポインタ型（引き数、戻り値）がなぜ有値オプショナル型


SwiftとObjective-C（C）ファイルの間にブリッジをするとき、ポインタ変数に、`nullable`、`nonnull`のオプションをつけないと、有値オプショナル（Implicitly
Unwrapped Optional）型としてブリッジされるようです。

_SampleClass.h_

[code]

    #import <Foundation/Foundation.h>
    
    @interface SampleClass : NSObject
    
    void changeValue(int * _Nonnull outValue, int inValue);
    void changeOptionalValue(int * _Nullable outValue, int inValue);
    void changeIUOValue(int *outValue, int inValue);
    
    @end
    
[/code]

3つの関数をSwift側から見ると、

[code]

    func changeValue(_ outValue: UnsafeMutablePointer<Int32>, _ intValue: Int32)
    func changeOptionalValue(_ outValue: UnsafeMutablePointer<Int32>?, _ inValue: Int32)
    func changeIUOValue(_outValue: UnsafeMutablePointer<Int32>!, _ inValue: Int32>
    
[/code]

こういう書式になります。  
C言語標準ライブラリの関数は、`nonnull`、`nullable`をつけようがないので、しぜんIUO（Implicitly Unwrapped
Optional）型の引数、返り値にならざるを得ないということではないでしょうか？明確な意図や、必然性があって、IUOにしているのではないと思います。


CC BY-SA 3.0
2017-02-01T10:25:00.780
32306
2017-02-01T23:56:35.973
2017-02-01T23:56:35.973
18540
18540
32303
answer