Antonio Linares wrote:
Que extensión de fichero usas para swift ?
Los Archivos swift usan la extension .Swift
Antonio Linares wrote:
Cómo lo compilas ?
Cómo lo enlazas ?
Para el experimento he realizado lo siguiente ..
Por un lado he creado _ nuevas dentro de la estructura de fivemac
una es objs donde van a parar los obj de archivos swift
otra es swift dentro de source que es donde he colocado el archivo swift experimental y donde van a parar los archivos auxiliares generados .
he creado dos archivos nuevos para no molestar demasiado a lo que tenemos en fivemac uno llamado foo.swift que he colocado en la capeta swift y otro llamado swfun.m que he colocado en winapi y que tiene el código para recoger los resultados ...
He modificado nuestro make file añadiendo :
SWIFTFLAGS = -I../include -sdk $(shell xcrun --show-sdk-path -sdk macosx)
una nueva sección ...
SWIFT_OBJS = ./objs/foo.o
y una nueva directiva de compilación
./objs/%.o : ./source/swift/%.swift
if [ ! -d "objs" ]; then mkdir objs; fi
swiftc -frontend -c -color-diagnostics -primary-file $< \
-module-name Bridgette \
$(SWIFTFLAGS) -emit-module -emit-module-path ./source/swift/$*.swiftmodule \
-emit-objc-header-path ./source/swift/$*-Swift.h \
-enable-testing -enable-objc-interop -parse-as-library \
-o $@
if [ ! -d "lib" ]; then mkdir lib; fi
ar rc ./lib/libfivec.a $@
Esto hace que los archivos colocados en la carpeta swift sean compilados , que generen un archivo .o y que generen un archivo cabecera <archivo>-Swift.h .
Este archivo de cabecera debe incluirse en el archivo .m que quiera usar funciones del archivo swift .
Se tendria que colocar al principio ya que si no esta generado el archivo .o de swift y su cabecera el archivo .m que contenga su código fallará al compilar .
Dentro de swift las funciones a usar las he colocado dentro de una clase publica swift y he creado métodos parta las funciones.
Todo esto es un experimento y está muy verde sobre todo el tema de paso de paramentos y sus tipos .
Apple ha apostado por swift en detrimento de objC , esta claro que se puede mezclar código swift con código objC .
Ya tenemos los comandos para poder compilar desde linea de comandos o desde un makefile .
Swift tiene un metodo relativamente simple para poder usar una función objC dentro de su código y debemos pensar que tanto las funciones internas de Harbour como nuestras funciones C son al final funciones C o lo que es lo mismo ObjC .
Desde una función C también podemos recuperar valores de funciones completas de swift y así poder usarlas dentro de harbour .
Uso simple ( sin usar funciones C dentro de swift )
archivo swfun.m
Code: Select all
#include <fivemac.h>
#import "../swift/foo-Swift.h"
HB_FUNC( HELLOCC )
{
NSString * stringIni = hb_NSSTRING_par( 1 ) ;
foo * sis = [[ foo alloc] init] ;
// NSString * string = [sis helloWithName:@"manuel" ] ;
NSString * string = [sis helloWithName: stringIni ] ;
hb_retc( [ string cStringUsingEncoding : NSUTF8StringEncoding ] );
}
archivo foo.swift
Code: Select all
import Foundation
@objc public class foo : NSObject {
@objc public func hello( name: String ) -> String {
return "Hello querido \( uno )"
}
}