- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在遵循有关从golang调用Objective-C代码的教程。本教程位于link
代码如下(与本教程相同)
main.go
package main
import (
"fmt"
"net/url"
"strconv"
"unsafe"
)
//#cgo CFLAGS: -x objective-c
//#cgo LDFLAGS: -framework Foundation
//#include "foundation.h"
import "C"
// NSString -> C string
func cstring(s *C.NSString) *C.char { return C.nsstring2cstring(s) }
// NSString -> Go string
func gostring(s *C.NSString) string { return C.GoString(cstring(s)) }
// NSNumber -> Go int
func goint(i *C.NSNumber) int { return int(C.nsnumber2int(i)) }
// NSArray length
func nsarraylen(arr *C.NSArray) uint { return uint(C.nsarraylen(arr)) }
// NSArray item
func nsarrayitem(arr *C.NSArray, i uint) unsafe.Pointer {
return C.nsarrayitem(arr, C.ulong(i))
}
// NSURL -> Go url.URL
func 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.URL
func 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())
}
#import <Foundation/Foundation.h>
typedef struct _NSURLdata {
NSString *scheme;
NSString *user;
NSString *password;
NSString *host;
NSNumber *port;
NSString *path;
NSString *query;
NSString *fragment;
} NSURLdata;
const char* nsstring2cstring(NSString*);
int nsnumber2int(NSNumber*);
unsigned long nsarraylen(NSArray*);
const void* nsarrayitem(NSArray*, unsigned long);
const NSURLdata* nsurldata(NSURL*);
const NSArray* UserApplicationSupportDirectories();
#import "foundation.h"
const char*
nsstring2cstring(NSString *s) {
if (s == NULL) { return NULL; }
const char *cstr = [s UTF8String];
return cstr;
}
int
nsnumber2int(NSNumber *i) {
if (i == NULL) { return 0; }
return i.intValue;
}
unsigned long
nsarraylen(NSArray *arr) {
if (arr == NULL) { return 0; }
return arr.count;
}
const void*
nsarrayitem(NSArray *arr, unsigned long i) {
if (arr == NULL) { return NULL; }
return [arr objectAtIndex:i];
}
const NSURLdata*
nsurldata(NSURL *url) {
NSURLdata *urldata = malloc(sizeof(NSURLdata));
urldata->scheme = url.scheme;
urldata->user = url.user;
urldata->password = url.password;
urldata->host = url.host;
urldata->port = url.port;
urldata->path = url.path;
urldata->query = url.query;
urldata->fragment = url.fragment;
return urldata;
}
const NSArray*
UserApplicationSupportDirectories() {
NSFileManager *manager = [NSFileManager defaultManager];
return [manager URLsForDirectory: NSApplicationSupportDirectory
inDomains: NSUserDomainMask];
}
cgo-gcc-prolog:70:47: warning: incompatible pointer types passing 'struct NSArray *' to parameter of type 'NSArray *' [-Wincompatible-pointer-types]
./foundation.h:17:33: note: passing argument to parameter here
cgo-gcc-prolog:88:22: warning: incompatible pointer types passing 'struct NSArray *' to parameter of type 'NSArray *' [-Wincompatible-pointer-types]
./foundation.h:16:34: note: passing argument to parameter here
cgo-gcc-prolog:107:24: warning: incompatible pointer types passing 'struct NSNumber *' to parameter of type 'NSNumber *' [-Wincompatible-pointer-types]
./foundation.h:15:27: note: passing argument to parameter here
cgo-gcc-prolog:125:52: warning: incompatible pointer types passing 'struct NSString *' to parameter of type 'NSString *' [-Wincompatible-pointer-types]
./foundation.h:14:39: note: passing argument to parameter here
cgo-gcc-prolog:143:45: warning: incompatible pointer types passing 'struct NSURL *' to parameter of type 'NSURL *' [-Wincompatible-pointer-types]
./foundation.h:18:34: note: passing argument to parameter here
最佳答案
CGO生成的C.NSString
与Objective-C的NSString
不兼容。为了避免来自编译器的警告消息,例如const char* nsstring2cstring()
中的NSString
应该作为objt_code传递到Objective-C代码函数void*
中的参数中,并将(foundation.m foundation.h)
转换为void*
并返回为NSString
:
const char* nsstring2cstring(void* s) {
if (s == NULL) { return NULL; }
NSString *cs = *((__unsafe_unretained NSString **)(s));
const char *cstr = [cs UTF8String];
return cstr;
}
C const char*
Go代码函数中,需要将
main.go
作为
C.NSString
传递给
unsafe.Pointer
// NSString -> C string
func cstring(s *C.NSString) *C.char { return C.nsstring2cstring(unsafe.Pointer(s)) }
关于objective-c - 不兼容的指针类型将 'struct NSArray *'传递给'NSArray *类型的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60677904/
我有一个数组 items[] items[] 中的每一项都是一个结构体。 item 有键 id、date、value(即 item.id、item.date、item.value) 我想使用 Stru
我想存储 100 名员工。 RollNo,姓名,工资,时间(各种数据,我无法在这里解释,但你可以看下面的代码片段来理解 main() { struct day { int hour
这个问题在这里已经有了答案: storage size of ‘names’ isn’t known (3 个答案) 关闭 5 年前。 我正在尝试蓝牙编程,遇到了这个我不明白的问题。基本上,当我使用
这是一个奇怪的事情: 我有一个结构,它包含指向相同类型结构的指针和指向其他类型结构的指针,以及一些其他值。 struct animal { struct animal * father;
我有一个结构定义如下(名称不同) struct str1 { int field1; struct str2; } 我在一个函数中有一个*str1。我想要一个指向 str2 的指针。 所以
DISK_DETECTION_INFO is defined as有什么原因吗? typedef struct _DISK_DETECTION_INFO { DWORD Size
我正在尝试打包一个字符串和一个字符串的长度。 fmt = '
我在创建结构时遇到问题。 我的结构: public struct Device: Codable { let data: DeviceData let meta: Meta? } pu
struct Item { var name:String? var type:String? var value:Int? var tag:Int? } ... ..
// NewReaderSize returns a new Reader whose buffer has at least the specified 43 // size. If the ar
这个问题在这里已经有了答案: Sorting a vector of custom objects (14 个答案) 关闭 3 年前。 在下面的 C++ 片段中, 如何基于 TwoInts 结构中的
#include struct Header { unsigned long long int alignment; }; int main(void) { struct Heade
我有一个目前看起来像这样的结构(缩写为仅显示基本部分): typedef struct { uint32_t baudrate; ... some other internally u
对此没有太多解释,这就是我所拥有的: public struct PACKET_HEADER { public string computerIp; publi
我有以下代码: struct MyStruct{ data: &'a str, } fn get(S: &'a MyStruct) -> &'a str{ S.data } fn se
struct S1 { char c; int i; }; struct S3 { char c1; struct S1 s; double c2; }; 我正
我有一个名为 Parameter 的协议(protocol): protocol Parameter { var name: String { get } var unit: Unit
有 2 个 struct 定义 A 和 A。我知道 struct A 可以包含指向 struct A 的 POINTER 但我不明白为什么 struct A 不能包含struct A(不是指针) 最佳
我有以下代码: struct MyStruct{ data: &'a str, } fn get(S: &'a MyStruct) -> &'a str{ S.data } fn se
为了说明这一点,这里有一个小的不可变结构和一个更新它的函数: (struct timeseries (variable observations) #:transparent) (define (ad
我是一名优秀的程序员,十分优秀!