FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveMac / FivePhone (iPhone, iPad) enviando datos desde una funci贸n en swift ( experimental )
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
enviando datos desde una funci贸n en swift ( experimental )
Posted: Mon Apr 10, 2017 01:15 PM
La funci贸n Swift
Code (fw): Select all Collapse
import Foundation

@objc public class foo : NSObject {
        
    @objc func printSome() -> String {
        
         return "Print line System" ;
        
    }
    
}


Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: enviando datos desde una funci贸n en swift ( experimental )
Posted: Mon Apr 10, 2017 01:43 PM
mastintin wrote:La funci贸n Swift
Code (fw): Select all Collapse
import Foundation

@objc public class foo : NSObject {
聽 聽 聽 聽 
聽 聽 @objc func printSome() -> String {
聽 聽 聽 聽 
聽 聽 聽 聽 聽return "Print line System" ;
聽 聽 聽 聽 
聽 聽 }
聽 聽 
}




Qu茅 bueno Manuel, genial
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noci贸n del tiempo

El secreto de la felicidad no est谩 en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: enviando datos desde una funci贸n en swift ( experimental )
Posted: Tue Apr 11, 2017 07:44 PM
Aun mas rebuscado ... y si uso una funci贸n de harbour dentro de una funci贸n swift y devuelvo el resultado a harbour ?
A ver si se entiende el tema que es un poco complicado ...

C贸digo en archivo swift ...
Code (fw): Select all Collapse
import Foundation
import AppKit

// Le decimos a swift que la 聽funci贸n seconds() no tiene par谩metros y devuelve un Double 聽y la renombrados como HBSEC() para usarla en Swift 
@_silgen_name("HB_FUN_SECONDS")
func HBSEC()-> CDouble

@objc public class foo : NSObject {
聽 聽 
聽 聽// creamos un metodo de foo llamado SECSW que usa seconds(), 聽en este caso solo devuelve su resultado ( podr铆a hacer lo cualquier cosa en swift ) 
聽 聽 @objc public func SECSW() -> CDouble {
聽 聽 聽 聽 聽 聽 let r = HBSEC()
聽 聽 聽 聽return r
聽 聽 }
聽 聽 聽 聽 聽
}


C贸digo en archivo objC para devolver a harbour el resultado final ...

Code (fw): Select all Collapse
// esto seria la nueva funci贸n Harbour final que devuelve el resultado de las operaciones realizadas en swift ...

HB_FUNC( NEWSECONDS )
{
聽 聽foo * sis = [[ foo alloc] init] ;
聽 聽 hb_retnd( [sis SECSW ] ) ; 聽 聽 聽 聽
}


En el programa fivemac ...
Code (fw): Select all Collapse
Msginfo( 聽NewSeconds() 聽)
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: enviando datos desde una funci贸n en swift ( experimental )
Posted: Wed Apr 12, 2017 05:18 PM

Manuel,

totalmente sorprendido :-)

Que extensi贸n de fichero usas para swift ?

C贸mo lo compilas ?

C贸mo lo enlazas ?

C贸mo es posible que puedan enlazarse ? Entiendo que swift usa su propia m谩quina virtual

Extraordinario como siempre ;-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: enviando datos desde una funci贸n en swift ( experimental )
Posted: Wed Apr 12, 2017 08:20 PM
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 dos carpetas 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 (fw): Select all Collapse
#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 (fw): Select all Collapse
import Foundation

@objc public class foo : NSObject {
聽 
聽 聽 聽 聽@objc public func hello( name: String ) -> String {
聽 聽 聽 聽 聽 return "Hello querido \( uno )"
聽 聽 
聽 聽 }
聽 聽 聽 聽 聽 聽
}
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: enviando datos desde una funci贸n en swift ( experimental )
Posted: Thu Apr 13, 2017 07:20 AM

Muy interesante, muchas gracias :-)

Eso quiere decir que la maquina virtual que usa Swift es la misma que usa Objective-C

eso parece

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: enviando datos desde una funci贸n en swift ( experimental )
Posted: Thu Apr 13, 2017 07:21 AM

Puedes copiar aqui el contenido de foo-Swift.h ?

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: enviando datos desde una funci贸n en swift ( experimental )
Posted: Thu Apr 13, 2017 10:46 AM
Antonio Linares wrote:Puedes copiar aqui el contenido de foo-Swift.h ?


El archivo f铆o-Swift.h es largo trae un mont贸n de definiciones y al final la pare interensante es un fichero de cabecera de objectiveC donde define la clase foo como si fuera c .
Cuando llegue a casa te lo env铆o pero lo bueno de todo esto es que con el c贸digo que he puesto en el makefile ,ese archivo es generado autom谩ticamente por el compilador y no tenemos que preocuparnos por el
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: enviando datos desde una funci贸n en swift ( experimental )
Posted: Thu Apr 13, 2017 11:09 AM

> un fichero de cabecera de objectiveC donde define la clase foo como si fuera c

eso es lo m谩s interesante, para ver como lo adapta a Objective-C

gracias!

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: enviando datos desde una funci贸n en swift ( experimental )
Posted: Thu Apr 13, 2017 01:10 PM
Antonio Linares wrote:> un fichero de cabecera de objectiveC donde define la clase foo como si fuera c

eso es lo m谩s interesante, para ver como lo adapta a Objective-C

gracias!


pongo aqu铆 el fichero completo , lo importante est谩 al final ...
una cosa ...
SWIFT_CLASS("_TtC9Bridgette3foo")
el nombre Bridgette no es casualidad ya que en el make file yo he puesto esto : -module-name Bridgette

Code (fw): Select all Collapse
// Generated by Apple Swift version 3.1 (swiftlang-802.0.51 clang-802.0.41)
#pragma clang diagnostic push

#if defined(__has_include) && __has_include(<swift/objc-prologue.h>)
# include <swift/objc-prologue.h>
#endif

#pragma clang diagnostic ignored "-Wauto-import"
#include <objc/NSObject.h>
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>

#if !defined(SWIFT_TYPEDEFS)
# define SWIFT_TYPEDEFS 1
# if defined(__has_include) && __has_include(<uchar.h>)
#  include <uchar.h>
# elif !defined(__cplusplus) || __cplusplus < 201103L
typedef uint_least16_t char16_t;
typedef uint_least32_t char32_t;
# endif
typedef float swift_float2  __attribute__((__ext_vector_type__(2)));
typedef float swift_float3  __attribute__((__ext_vector_type__(3)));
typedef float swift_float4  __attribute__((__ext_vector_type__(4)));
typedef double swift_double2  __attribute__((__ext_vector_type__(2)));
typedef double swift_double3  __attribute__((__ext_vector_type__(3)));
typedef double swift_double4  __attribute__((__ext_vector_type__(4)));
typedef int swift_int2  __attribute__((__ext_vector_type__(2)));
typedef int swift_int3  __attribute__((__ext_vector_type__(3)));
typedef int swift_int4  __attribute__((__ext_vector_type__(4)));
typedef unsigned int swift_uint2  __attribute__((__ext_vector_type__(2)));
typedef unsigned int swift_uint3  __attribute__((__ext_vector_type__(3)));
typedef unsigned int swift_uint4  __attribute__((__ext_vector_type__(4)));
#endif

#if !defined(SWIFT_PASTE)
# define SWIFT_PASTE_HELPER(x, y) x##y
# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
#endif
#if !defined(SWIFT_METATYPE)
# define SWIFT_METATYPE(X) Class
#endif
#if !defined(SWIFT_CLASS_PROPERTY)
# if __has_feature(objc_class_property)
#  define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__
# else
#  define SWIFT_CLASS_PROPERTY(...)
# endif
#endif

#if defined(__has_attribute) && __has_attribute(objc_runtime_name)
# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
#else
# define SWIFT_RUNTIME_NAME(X)
#endif
#if defined(__has_attribute) && __has_attribute(swift_name)
# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X)))
#else
# define SWIFT_COMPILE_NAME(X)
#endif
#if defined(__has_attribute) && __has_attribute(objc_method_family)
# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X)))
#else
# define SWIFT_METHOD_FAMILY(X)
#endif
#if defined(__has_attribute) && __has_attribute(noescape)
# define SWIFT_NOESCAPE __attribute__((noescape))
#else
# define SWIFT_NOESCAPE
#endif
#if defined(__has_attribute) && __has_attribute(warn_unused_result)
# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
#else
# define SWIFT_WARN_UNUSED_RESULT
#endif
#if !defined(SWIFT_CLASS_EXTRA)
# define SWIFT_CLASS_EXTRA
#endif
#if !defined(SWIFT_PROTOCOL_EXTRA)
# define SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_ENUM_EXTRA)
# define SWIFT_ENUM_EXTRA
#endif
#if !defined(SWIFT_CLASS)
# if defined(__has_attribute) && __has_attribute(objc_subclassing_restricted)
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
#  define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# else
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
#  define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# endif
#endif

#if !defined(SWIFT_PROTOCOL)
# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
#endif

#if !defined(SWIFT_EXTENSION)
# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
#endif

#if !defined(OBJC_DESIGNATED_INITIALIZER)
# if defined(__has_attribute) && __has_attribute(objc_designated_initializer)
#  define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
# else
#  define OBJC_DESIGNATED_INITIALIZER
# endif
#endif
#if !defined(SWIFT_ENUM)
# define SWIFT_ENUM(_type, _name) enum _name : _type _name; enum SWIFT_ENUM_EXTRA _name : _type
# if defined(__has_feature) && __has_feature(generalized_swift_name)
#  define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_EXTRA _name : _type
# else
#  define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME) SWIFT_ENUM(_type, _name)
# endif
#endif
#if !defined(SWIFT_UNAVAILABLE)
# define SWIFT_UNAVAILABLE __attribute__((unavailable))
#endif
#if !defined(SWIFT_UNAVAILABLE_MSG)
# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg)))
#endif
#if !defined(SWIFT_AVAILABILITY)
# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__)))
#endif
#if !defined(SWIFT_DEPRECATED)
# define SWIFT_DEPRECATED __attribute__((deprecated))
#endif
#if !defined(SWIFT_DEPRECATED_MSG)
# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__)))
#endif
#if defined(__has_feature) && __has_feature(modules)
@import ObjectiveC;
#endif

#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
#pragma clang diagnostic ignored "-Wduplicate-method-arg"

SWIFT_CLASS("_TtC9Bridgette3foo")
@interface foo : NSObject
- (NSString * _Nonnull)helloWithName:(NSString * _Nonnull)name SWIFT_WARN_UNUSED_RESULT;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

#pragma clang diagnostic pop
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: enviando datos desde una funci贸n en swift ( experimental )
Posted: Fri Apr 14, 2017 08:59 AM

supongo que ambos usan la m谩quina virtual LLVM

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: enviando datos desde una funci贸n en swift ( experimental )
Posted: Fri Apr 14, 2017 11:53 AM
Antonio Linares wrote:supongo que ambos usan la m谩quina virtual LLVM
los dos generan despu茅s de varios procesos archivos con llvm bitcode
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: enviando datos desde una funci贸n en swift ( experimental )
Posted: Fri Apr 14, 2017 12:46 PM
Sigo con los experimentos ... he intentado hacer algo un paso mas complejo ...
Replicar la funci贸n que tenemos para poner archivos en la papelera ( MOVETOTRASH ) en swift y intentar llamarla desde un programa ...
He querido saltarme tambi茅n la conversion de const char* a NSString y p谩sarla directamente a Swift y parece que funciona bien.

en swift :

Code (fw): Select all Collapse
  @objc public func totrash( file: UnsafePointer<CChar> ) -> Bool {
        
        let s = String(cString: file )
        var lresult = false
        let fileM = FileManager.default
        let urlPath = NSURL.fileURL(withPath: s )
        
        if fileM.isDeletableFile(atPath:s){
            do {
                try fileM.trashItem(at:urlPath, resultingItemURL: nil )
                lresult = true
            }
                catch  {
                lresult = false
                
            }

        }
        
        return lresult
     }


en M file ...

Code (fw): Select all Collapse
HB_FUNC( MOVETOTRASH3 )
{
  hb_retl( [[[ foo alloc] init] totrashWithFile: hb_parc( 1 )  ]  ) ;
 }
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: enviando datos desde una funci贸n en swift ( experimental )
Posted: Fri Apr 14, 2017 07:44 PM

muy bien :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion