2017-05-25 66 views
0

此代码在Swift2.3中运行良好,现在我将它转换为Swift3。所以我得到这个错误。任何人有想法,如何解决这个问题?swift3.0无法将类型'[UnsafeMutablePointer <Int8>]'的值转换为期望的参数类型'UnsafeMutablePointer <Int8>?'

var cmdLnConf: OpaquePointer? 
fileprivate var cArgs: [UnsafeMutablePointer<Int8>] 

public init?(args: (String,String)...) { 

    // Create [UnsafeMutablePointer<Int8>]. 
    cArgs = args.flatMap { (name, value) -> [UnsafeMutablePointer<Int8>] in 
     //strdup move the strings to the heap and return a UnsageMutablePointer<Int8> 
     return [strdup(name),strdup(value)] 
    } 

    cmdLnConf = cmd_ln_parse_r(nil, ps_args(), CInt(cArgs.count), &cArgs, STrue) 

    if cmdLnConf == nil { 
     return nil 
    } 
} 

enter image description here

+1

请不要使用图片代替代码;将代码粘贴到您的问题中。 –

+1

此外,你的问题的标题给你的答案... –

+0

对不起,我是一个快速c.I完全不知道如何解决它的新手。你能帮我吗? –

回答

0

根据我们的讨论,似乎在你的C函数的参数应该是char *p[]

我做了一个小测试

// 
// f.h 
// test001 
// 

#ifndef f_h 
#define f_h 

#include <stdio.h> 

void f(char *p[], int len); 

#endif /* f_h */ 

我一些基本定义的函数功能

// 
// f.c 
// test001 

#include "f.h" 

void f(char *p[], int len) { 
    for(int i = 0; i<len; i++) { 
     printf("%s\n", p[i]); 
    }; 

}; 

与所需的桥接报头

// 
// Use this file to import your target's public headers that you would like to expose to Swift. 
// 

#include "f.h" 

快捷 '命令行' 应用

// 
// main.swift 
// test001 
// 

import Darwin 

var s0 = strdup("alfa") 
var s1 = strdup("beta") 
var s2 = strdup("gama") 
var s3 = strdup("delta") 


var arr = [s0,s1,s2,s3] 
let ac = Int32(arr.count) 


arr.withUnsafeMutableBytes { (p) ->() in 
    let pp = p.baseAddress?.assumingMemoryBound(to: UnsafeMutablePointer<Int8>?.self) 
    f(pp, ac) 
} 

它终于打印

alfa 
beta 
gama 
delta 
Program ended with exit code: 0 

基础上,因此,您必须使用

let count = CInt(cArgs.count) 
cArgs.withUnsafeMutableBytes { (p) ->() in 
    let pp = p.baseAddress?.assumingMemoryBound(to: UnsafeMutablePointer<Int8>?.self) 
    cmdLnConf = cmd_ln_parse_r(nil, ps_args(), count, pp, STrue) 
} 

警告!!! 不要在封闭体内调用cArgs.count,这里定义了指针!

+0

它工作得很好,非常感谢你 –

相关问题