亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

不兼容的指針類型將“struct NSArray *”傳遞給“NSArray *”類型的參數

不兼容的指針類型將“struct NSArray *”傳遞給“NSArray *”類型的參數

Go
倚天杖 2022-05-23 15:04:33
我正在關注從golang調用objective-c代碼的教程。教程在這個鏈接代碼如下(教程上也一樣)main.gopackage mainimport (    "fmt"    "net/url"    "strconv"    "unsafe")//#cgo CFLAGS: -x objective-c//#cgo LDFLAGS: -framework Foundation//#include "foundation.h"import "C"// NSString -> C stringfunc cstring(s *C.NSString) *C.char { return C.nsstring2cstring(s) }// NSString -> Go stringfunc gostring(s *C.NSString) string { return C.GoString(cstring(s)) }// NSNumber -> Go intfunc goint(i *C.NSNumber) int { return int(C.nsnumber2int(i)) }// NSArray lengthfunc nsarraylen(arr *C.NSArray) uint { return uint(C.nsarraylen(arr)) }// NSArray itemfunc nsarrayitem(arr *C.NSArray, i uint) unsafe.Pointer {    return C.nsarrayitem(arr, C.ulong(i))}// NSURL -> Go url.URLfunc gourl(nsurlptr *C.NSURL) *url.URL {    nsurl := *C.nsurldata(nsurlptr)    userInfo := url.UserPassword(        gostring(nsurl.user),        gostring(nsurl.password),    )    host := gostring(nsurl.host)    if nsurl.port != nil {        port := goint(nsurl.port)        host = host + ":" + strconv.FormatInt(int64(port), 10)    }    return &url.URL{        Scheme:   gostring(nsurl.scheme),        User:     userInfo, // username and password information        Host:     host,     // host or host:port        Path:     gostring(nsurl.path),        RawQuery: gostring(nsurl.query),    // encoded query values, without '?'        Fragment: gostring(nsurl.fragment), // fragment for references, without '#'    }}// NSArray<NSURL> -> Go []url.URLfunc gourls(arr *C.NSArray) []url.URL {    var result []url.URL    length := nsarraylen(arr)    for i := uint(0); i < length; i++ {        nsurl := (*C.NSURL)(nsarrayitem(arr, i))        u := gourl(nsurl)        result = append(result, *u)    }    return result}func UserApplicationSupportDirectories() []url.URL {    return gourls(C.UserApplicationSupportDirectories())}func main() {    fmt.Printf("%#+v\n", UserApplicationSupportDirectories())}
查看完整描述

1 回答

?
慕碼人2483693

TA貢獻1860條經驗 獲得超9個贊

C.NSStringCGO 生成的與NSStringObjective-C 不兼容。為避免來自編譯器的警告消息,例如 in const char* nsstring2cstring(),NSString應void*在您的 Objective-C 代碼函數中作為 in 參數傳遞(foundation.m foundation.h),并將您的void*toNSString和返回為C const char*:


const char* nsstring2cstring(void* s) {

    if (s == NULL) { return NULL; }

    NSString *cs = *((__unsafe_unretained NSString **)(s));

    const char *cstr = [cs UTF8String];

    return cstr;

}

在main.goGo 代碼函數中,它需要C.NSString作為unsafe.Pointerto傳遞nsstring2cstring(void*)


// NSString -> C string

func cstring(s *C.NSString) *C.char { return C.nsstring2cstring(unsafe.Pointer(s)) }


查看完整回答
反對 回復 2022-05-23
  • 1 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號