Detalles: Proyecto Objective-C con código Swift 3 en Xcode 8.1
Tareas:
- Usa una enumeración rápida en la clase de Objective-C
- Use el objetivo-c enum en clase rápida
MUESTRA COMPLETA
1. Clase Objective-C que usa la enumeración Swift
ObjcClass.h
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSInteger, ObjcEnum) {
ObjcEnumValue1,
ObjcEnumValue2,
ObjcEnumValue3
};
@interface ObjcClass : NSObject
+ (void) PrintEnumValues;
@end
ObjcClass.m
#import "ObjcClass.h"
#import "SwiftCode.h"
@implementation ObjcClass
+ (void) PrintEnumValues {
[self PrintEnumValue:SwiftEnumValue1];
[self PrintEnumValue:SwiftEnumValue2];
[self PrintEnumValue:SwiftEnumValue3];
}
+ (void) PrintEnumValue:(SwiftEnum) value {
switch (value) {
case SwiftEnumValue1:
NSLog(@"-- SwiftEnum: SwiftEnumValue1");
break;
case SwiftEnumValue2:
case SwiftEnumValue3:
NSLog(@"-- SwiftEnum: long value = %ld", (long)value);
break;
}
}
@end
Detectar código Swift en código Objective-C
En mi muestra, uso SwiftCode.h para detectar el código Swift en Objective-C. Este archivo se genera automáticamente (no creé una copia física de este archivo de encabezado en un proyecto), y solo puede establecer el nombre de este archivo:
Si el compilador no puede encontrar el código Swift de su archivo de encabezado, intente compilar el proyecto.
2. Clase Swift que usa la enumeración Objective-C
import Foundation
@objc
enum SwiftEnum: Int {
case Value1, Value2, Value3
}
@objc
class SwiftClass: NSObject {
class func PrintEnumValues() {
PrintEnumValue(.Value1)
PrintEnumValue(.Value2)
PrintEnumValue(.Value3)
}
class func PrintEnumValue(value: ObjcEnum) {
switch value {
case .Value1, .Value2:
NSLog("-- ObjcEnum: int value = \(value.rawValue)")
case .Value3:
NSLog("-- ObjcEnum: Value3")
break
}
}
}
Detectar código Objective-C en código Swift
Necesita crear un archivo de encabezado de puente. Cuando agrega el archivo Swift en el proyecto Objective-C, o el archivo Objective-C en el proyecto Swift Xcode le sugerirá que cree un encabezado de puente.
Puede cambiar el nombre del archivo de encabezado de puente aquí:
Bridging-Header.h
#import "ObjcClass.h"
Uso
#import "SwiftCode.h"
...
[ObjcClass PrintEnumValues];
[SwiftClass PrintEnumValues];
[SwiftClass PrintEnumValue:ObjcEnumValue3];
Resultado
Más muestras
Pasos de integración completos Objective-c y Swift descritos anteriormente . Ahora escribiré algunos otros ejemplos de código.
3. Llame a la clase Swift desde el código Objective-c
Clase rápida
import Foundation
@objc
class SwiftClass:NSObject {
private var _stringValue: String
var stringValue: String {
get {
print("SwiftClass get stringValue")
return _stringValue
}
set {
print("SwiftClass set stringValue = \(newValue)")
_stringValue = newValue
}
}
init (stringValue: String) {
print("SwiftClass init(String)")
_stringValue = stringValue
}
func printValue() {
print("SwiftClass printValue()")
print("stringValue = \(_stringValue)")
}
}
Código Objective-C (código de llamada)
SwiftClass *obj = [[SwiftClass alloc] initWithStringValue: @"Hello World!"];
[obj printValue];
NSString * str = obj.stringValue;
obj.stringValue = @"HeLLo wOrLd!!!";
Resultado
4. Llame a la clase Objective-c desde el código Swift
Clase Objective-C (ObjcClass.h)
#import <Foundation/Foundation.h>
@interface ObjcClass : NSObject
@property NSString* stringValue;
- (instancetype) initWithStringValue:(NSString*)stringValue;
- (void) printValue;
@end
ObjcClass.m
#import "ObjcClass.h"
@interface ObjcClass()
@property NSString* strValue;
@end
@implementation ObjcClass
- (instancetype) initWithStringValue:(NSString*)stringValue {
NSLog(@"ObjcClass initWithStringValue");
_strValue = stringValue;
return self;
}
- (void) printValue {
NSLog(@"ObjcClass printValue");
NSLog(@"stringValue = %@", _strValue);
}
- (NSString*) stringValue {
NSLog(@"ObjcClass get stringValue");
return _strValue;
}
- (void) setStringValue:(NSString*)newValue {
NSLog(@"ObjcClass set stringValue = %@", newValue);
_strValue = newValue;
}
@end
Código Swift (código de llamada)
if let obj = ObjcClass(stringValue: "Hello World!") {
obj.printValue()
let str = obj.stringValue;
obj.stringValue = "HeLLo wOrLd!!!";
}
Resultado
5. Use la extensión Swift en el código Objective-c
Extensión rápida
extension UIView {
static func swiftExtensionFunc() {
NSLog("UIView swiftExtensionFunc")
}
}
Código Objective-C (código de llamada)
[UIView swiftExtensionFunc];
6. Use la extensión Objective-c en código rápido
Extensión Objective-C (UIViewExtension.h)
#import <UIKit/UIKit.h>
@interface UIView (ObjcAdditions)
+ (void)objcExtensionFunc;
@end
UIViewExtension.m
@implementation UIView (ObjcAdditions)
+ (void)objcExtensionFunc {
NSLog(@"UIView objcExtensionFunc");
}
@end
Código Swift (código de llamada)
UIView.objcExtensionFunc()
YourProjectName-Swift.h
debe ser un archivo de encabezado mágico que Xcode crea automáticamente para usted durante la compilación (en realidad no lo verá en el navegador del proyecto). Intente eliminar el que creó y agréguelo#import YourProjectName-Swift.h
a los archivos en los que desea usar las clases Swift.