Detalhes: Projeto Objective-C com código Swift 3 no Xcode 8.1
Tarefas:
- Use enumeração rápida na classe objetivo-c
- Use o enum objetivo-c na classe rápida
AMOSTRA COMPLETA
1. Classe Objective-C que usa o Swift enum
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 no código Objective-C
No meu exemplo, eu uso o SwiftCode.h para detectar o código Swift no Objective-C. Esse arquivo é gerado automaticamente (não criei uma cópia física desse arquivo de cabeçalho em um projeto) e você pode definir apenas o nome desse arquivo:
Se o compilador não conseguir encontrar o código Swift do arquivo de cabeçalho, tente compilar o projeto.
2. Classe Swift que usa enum 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 o código Objective-C no código Swift
Você precisa criar um arquivo de cabeçalho de ponte. Quando você adiciona o arquivo Swift no projeto Objective-C, ou o arquivo Objective-C no projeto swift, o Xcode sugere que você crie um cabeçalho de ponte.
Você pode alterar o nome do arquivo do cabeçalho da ponte aqui:
Bridging-Header.h
#import "ObjcClass.h"
Uso
#import "SwiftCode.h"
...
[ObjcClass PrintEnumValues];
[SwiftClass PrintEnumValues];
[SwiftClass PrintEnumValue:ObjcEnumValue3];
Resultado
MAIS AMOSTRAS
Etapas completas de integração Objective-c e Swift descritas acima . Agora vou escrever alguns outros exemplos de código.
3. Chame a classe Swift a partir do código Objective-c
Classe 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 chamada)
SwiftClass *obj = [[SwiftClass alloc] initWithStringValue: @"Hello World!"];
[obj printValue];
NSString * str = obj.stringValue;
obj.stringValue = @"HeLLo wOrLd!!!";
Resultado
4. Chame a classe Objective-c a partir do código Swift
Classe 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 chamada)
if let obj = ObjcClass(stringValue: "Hello World!") {
obj.printValue()
let str = obj.stringValue;
obj.stringValue = "HeLLo wOrLd!!!";
}
Resultado
5. Use a extensão Swift no código Objective-c
Extensão rápida
extension UIView {
static func swiftExtensionFunc() {
NSLog("UIView swiftExtensionFunc")
}
}
Código Objective-C (código de chamada)
[UIView swiftExtensionFunc];
6. Use a extensão Objective-c no código swift
Extensão 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 chamada)
UIView.objcExtensionFunc()
YourProjectName-Swift.h
deve ser um arquivo de cabeçalho mágico que o Xcode cria automaticamente para você durante a compilação (na verdade, você não o verá no navegador do projeto). Tente excluir o que você criou e adicione#import YourProjectName-Swift.h
aos arquivos nos quais deseja usar as classes Swift.