2017-05-25 96 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

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

相關問題