feat: add swift from go

This commit is contained in:
2025-07-18 22:47:41 +08:00
parent c68d63fe52
commit ebb2161ca4
8 changed files with 106 additions and 0 deletions

View File

@@ -0,0 +1,29 @@
// swift-tools-version:4.2
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "go-swift",
products: [
// Products define the executables and libraries produced by a package, and make them visible to other packages.
.library(
name: "go_swift",
type: .dynamic,
targets: ["go-swift"]),
],
dependencies: [
// Dependencies declare other packages that this package depends on.
// .package(url: /* package url */, from: "1.0.0"),
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
.target(
name: "go-swift",
dependencies: []),
.testTarget(
name: "go-swiftTests",
dependencies: ["go-swift"]),
]
)

15
swift-from-go/README.md Normal file
View File

@@ -0,0 +1,15 @@
# go-swift
> Clone from: https://github.com/onderweg/swift-from-go
Example code, complementing the blog post: ["Calling Swift from Go"](https://dev.to/gerwert/calling-swift-from-go-5dbk)
_Note: this repo is more than 3 years old. Feel free to use it as reference, but don't expect it to work with current versions of Go and Swift._
## Building & Running
```
$ swift build
$ go build -o hello
$ ./hello
```

View File

@@ -0,0 +1,7 @@
@_cdecl("sayHello") // export to C as `sayHello``
public func sayHello(namePtr: UnsafePointer<CChar>?) {
// Creates a new string by copying the null-terminated UTF-8 data (C String)
// referenced by the given pointer.
let name = String(cString: namePtr!)
print("Welcome, \(name)!")
}

View File

@@ -0,0 +1,7 @@
import XCTest
import go_swiftTests
var tests = [XCTestCaseEntry]()
tests += go_swiftTests.allTests()
XCTMain(tests)

View File

@@ -0,0 +1,9 @@
import XCTest
#if !os(macOS)
public func allTests() -> [XCTestCaseEntry] {
return [
testCase(go_swiftTests.allTests),
]
}
#endif

View File

@@ -0,0 +1,15 @@
import XCTest
@testable import go_swift
final class go_swiftTests: XCTestCase {
func testExample() {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct
// results.
XCTAssertEqual(go_swift().text, "Hello, World!")
}
static var allTests = [
("testExample", testExample),
]
}

View File

@@ -0,0 +1,2 @@
// Manually crafted header file for C Library
void sayHello(char* name);

22
swift-from-go/main.go Normal file
View File

@@ -0,0 +1,22 @@
package main
/*
#cgo CFLAGS: -I./include
#cgo LDFLAGS: -L.build/debug/ -lgo_swift
#include <stdlib.h>
#include "include/go_swift.h"
*/
import "C"
import "unsafe"
func main() {
// Convert Go string to C string
cstr := C.CString("Bob")
// Call Swift function `sayHello``
C.sayHello(cstr)
// The C string is allocated in the C heap using malloc.
// Therefore memory must be freed when we're done
C.free(unsafe.Pointer(cstr))
}