[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