feat: add swift from go
This commit is contained in:
29
swift-from-go/Package.swift
Normal file
29
swift-from-go/Package.swift
Normal 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
15
swift-from-go/README.md
Normal 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
|
||||
```
|
||||
7
swift-from-go/Sources/go-swift/go_swift.swift
Normal file
7
swift-from-go/Sources/go-swift/go_swift.swift
Normal 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)!")
|
||||
}
|
||||
7
swift-from-go/Tests/LinuxMain.swift
Normal file
7
swift-from-go/Tests/LinuxMain.swift
Normal file
@@ -0,0 +1,7 @@
|
||||
import XCTest
|
||||
|
||||
import go_swiftTests
|
||||
|
||||
var tests = [XCTestCaseEntry]()
|
||||
tests += go_swiftTests.allTests()
|
||||
XCTMain(tests)
|
||||
9
swift-from-go/Tests/go-swiftTests/XCTestManifests.swift
Normal file
9
swift-from-go/Tests/go-swiftTests/XCTestManifests.swift
Normal file
@@ -0,0 +1,9 @@
|
||||
import XCTest
|
||||
|
||||
#if !os(macOS)
|
||||
public func allTests() -> [XCTestCaseEntry] {
|
||||
return [
|
||||
testCase(go_swiftTests.allTests),
|
||||
]
|
||||
}
|
||||
#endif
|
||||
15
swift-from-go/Tests/go-swiftTests/go_swiftTests.swift
Normal file
15
swift-from-go/Tests/go-swiftTests/go_swiftTests.swift
Normal 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),
|
||||
]
|
||||
}
|
||||
2
swift-from-go/include/go_swift.h
Normal file
2
swift-from-go/include/go_swift.h
Normal file
@@ -0,0 +1,2 @@
|
||||
// Manually crafted header file for C Library
|
||||
void sayHello(char* name);
|
||||
22
swift-from-go/main.go
Normal file
22
swift-from-go/main.go
Normal 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))
|
||||
}
|
||||
Reference in New Issue
Block a user