Détails: Projet Objective-C avec code Swift 3 dans Xcode 8.1
Tâches:
- Utiliser l'énumération rapide dans la classe objective-c
- Utiliser l'énumération objective-c dans la classe rapide
ÉCHANTILLON COMPLET
1. Classe Objective-C qui utilise l'énumération 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
Détecter le code Swift dans le code Objective-C
Dans mon exemple, j'utilise SwiftCode.h pour détecter le code Swift dans Objective-C. Ce fichier est généré automatiquement (je n'ai pas créé de copie physique de ce fichier d'en-tête dans un projet), et vous ne pouvez définir que le nom de ce fichier:
Si le compilateur ne trouve pas votre code Swift de fichier d'en-tête, essayez de compiler le projet.
2. Classe Swift qui utilise l'énumération 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
}
}
}
Détecter le code Objective-C dans le code Swift
Vous devez créer un fichier d'en-tête de pontage. Lorsque vous ajoutez un fichier Swift dans le projet Objective-C ou un fichier Objective-C dans le projet Swift, Xcode vous proposera de créer un en-tête de pontage.
Vous pouvez modifier le nom du fichier d'en-tête de pontage ici:
Bridging-Header.h
#import "ObjcClass.h"
Usage
#import "SwiftCode.h"
...
[ObjcClass PrintEnumValues];
[SwiftClass PrintEnumValues];
[SwiftClass PrintEnumValue:ObjcEnumValue3];
Résultat
PLUS D'ÉCHANTILLONS
Étapes d'intégration complète Objective-c et Swift décrites ci-dessus . Maintenant, je vais écrire quelques autres exemples de code.
3. Appelez la classe Swift à partir du code Objective-c
Classe Swift
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)")
}
}
Code Objective-C (code appelant)
SwiftClass *obj = [[SwiftClass alloc] initWithStringValue: @"Hello World!"];
[obj printValue];
NSString * str = obj.stringValue;
obj.stringValue = @"HeLLo wOrLd!!!";
Résultat
4. Appelez la classe Objective-c à partir du code 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
Code Swift (code d'appel)
if let obj = ObjcClass(stringValue: "Hello World!") {
obj.printValue()
let str = obj.stringValue;
obj.stringValue = "HeLLo wOrLd!!!";
}
Résultat
5. Utilisez l'extension Swift dans le code Objective-c
Extension rapide
extension UIView {
static func swiftExtensionFunc() {
NSLog("UIView swiftExtensionFunc")
}
}
Code Objective-C (code appelant)
[UIView swiftExtensionFunc];
6. Utilisez l'extension Objective-c dans le code rapide
Extension 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
Code Swift (code d'appel)
UIView.objcExtensionFunc()
YourProjectName-Swift.h
devrait être un fichier d'en-tête magique que Xcode crée automatiquement pour vous pendant la compilation (vous ne le verrez pas réellement dans le navigateur du projet). Essayez de supprimer celui que vous avez créé et ajoutez-le#import YourProjectName-Swift.h
aux fichiers dans lesquels vous souhaitez utiliser les classes Swift.