[swift-users] C API returns null but optional thinks it's set anyway

Rick Mann rmann at latencyzero.com
Fri Jul 1 15:55:43 CDT 2016


> On Jul 1, 2016, at 05:42 , Dan Loewenherz <dan at lionheartsw.com> wrote:
> 
> What’s the Swift type signature on GDALOpen? My guess is that it’s returning a UnsafePointer<Void> or UnsafeMutablePointer<Void> type. Swift doesn’t currently handle nullability for C pointers (hence the “Unsafe” prefix). You’ll need to check the value at the pointer’s location manually.

It looks like this:

typealias GDALDatasetH = UnsafeMutablePointer<Void>
@warn_unused_result func GDALOpen(pszFilename: UnsafePointer<Int8>, _ eAccess: GDALAccess) -> GDALDatasetH

Thanks for the clarification. It sure seems like Swift could easily check for Unsafe Pointers with value == 0.

> 
> Dan
> 
> On Fri, Jul 1, 2016 at 2:59 AM, Rick Mann via swift-users <swift-users at swift.org> wrote:
> I have some Swift code (in Xcode 7.3) that's calling a C function in the GDAL library. It's declared like this:
> 
> typedef void *GDALDatasetH;
> GDALDatasetH CPL_DLL CPL_STDCALL
> GDALOpen( const char *pszFilename, GDALAccess eAccess ) CPL_WARN_UNUSED_RESULT;
> 
> I'm calling it with code like this:
> 
> class
> MyClass
> {
>     func foo()
>     {
>         self.dataset = GDALOpen(path, GA_ReadOnly)
>     }
> 
>     var dataset: GDALDatasetH?
> }
> 
> But later code
> 
>     if let ds = self.dataset
>     {
>         print("dataset: \(ds)")
>     }
> 
> outputs this to the console:
> 
>     dataset: 0x0000000000000000
> 
> This seems very broken.
> 
> --
> Rick Mann
> rmann at latencyzero.com
> 
> 
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
> 


-- 
Rick Mann
rmann at latencyzero.com




More information about the swift-users mailing list