विवरण: Xcode 8.1 में स्विफ्ट 3 कोड के साथ उद्देश्य-सी परियोजना
कार्य:
- वस्तुनिष्ठ-सी कक्षा में स्विम एनम का उपयोग करें
- स्विफ्ट क्लास में ऑब्जेक्टिव-सी एनम का उपयोग करें
पूरा नमूना
1. उद्देश्य-सी वर्ग जो स्विफ्ट एनम का उपयोग करते हैं
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
ऑब्जेक्टिव-सी कोड में स्विफ्ट कोड का पता लगाएं
अपने नमूने में मैं Objective-C में Swift कोड का पता लगाने के लिए SwiftCode.h का उपयोग करता हूं। यह फ़ाइल स्वतः उत्पन्न होती है (मैंने किसी प्रोजेक्ट में इस हेडर फ़ाइल की भौतिक प्रतिलिपि नहीं बनाई है), और आप केवल इस फ़ाइल का नाम सेट कर सकते हैं:
यदि कंपाइलर आपकी हेडर फ़ाइल स्विफ्ट कोड नहीं ढूंढ सकता है, तो प्रोजेक्ट को संकलित करने का प्रयास करें।
2. स्विफ्ट क्लास जो ऑब्जेक्टिव-सी एनम का उपयोग करती है
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
}
}
}
स्विफ्ट कोड में ऑब्जेक्टिव-सी कोड का पता लगाएं
आपको ब्रिजिंग हेडर फ़ाइल बनाने की आवश्यकता है। जब आप ऑब्जेक्ट-सी प्रोजेक्ट में स्विफ्ट फ़ाइल जोड़ते हैं, या स्विफ्ट प्रोजेक्ट Xcode में ऑब्जेक्टिव-सी फ़ाइल आपको ब्राइडिंग हेडर बनाने का सुझाव देंगे।
आप शीर्षक फ़ाइल का नाम यहाँ बदल सकते हैं:
ब्रिजिंग-Header.h
#import "ObjcClass.h"
प्रयोग
#import "SwiftCode.h"
...
[ObjcClass PrintEnumValues];
[SwiftClass PrintEnumValues];
[SwiftClass PrintEnumValue:ObjcEnumValue3];
परिणाम
अधिक नमूने
पूर्ण एकीकरण कदम उद्देश्य-सी और स्विफ्ट ऊपर वर्णित है । अब मैं कुछ अन्य कोड उदाहरण लिखूंगा।
3. ऑब्जेक्टिव-सी कोड से स्विफ्ट क्लास को कॉल करें
स्विफ्ट क्लास
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)")
}
}
उद्देश्य-सी कोड (कॉलिंग कोड)
SwiftClass *obj = [[SwiftClass alloc] initWithStringValue: @"Hello World!"];
[obj printValue];
NSString * str = obj.stringValue;
obj.stringValue = @"HeLLo wOrLd!!!";
परिणाम
4. स्विफ्ट कोड से ऑब्जेक्टिव-सी क्लास को कॉल करें
ऑब्जेक्टिव-सी क्लास (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
स्विफ्ट कोड (कॉलिंग कोड)
if let obj = ObjcClass(stringValue: "Hello World!") {
obj.printValue()
let str = obj.stringValue;
obj.stringValue = "HeLLo wOrLd!!!";
}
परिणाम
5. ऑब्जेक्टिव-सी कोड में स्विफ्ट एक्सटेंशन का उपयोग करें
स्विफ्ट का विस्तार
extension UIView {
static func swiftExtensionFunc() {
NSLog("UIView swiftExtensionFunc")
}
}
उद्देश्य-सी कोड (कॉलिंग कोड)
[UIView swiftExtensionFunc];
6. स्विफ्ट कोड में ऑब्जेक्टिव-सी एक्सटेंशन का इस्तेमाल करें
उद्देश्य-सी विस्तार (UIViewExtension.h)
#import <UIKit/UIKit.h>
@interface UIView (ObjcAdditions)
+ (void)objcExtensionFunc;
@end
UIViewExtension.m
@implementation UIView (ObjcAdditions)
+ (void)objcExtensionFunc {
NSLog(@"UIView objcExtensionFunc");
}
@end
स्विफ्ट कोड (कॉलिंग कोड)
UIView.objcExtensionFunc()
YourProjectName-Swift.h
एक जादुई हेडर फ़ाइल होनी चाहिए जिसे Xcode स्वचालित रूप से संकलन के दौरान आपके लिए बनाता है (आप वास्तव में इसे प्रोजेक्ट ब्राउज़र में नहीं देखेंगे)। आपके द्वारा बनाए गए को हटाने का प्रयास करें, और#import YourProjectName-Swift.h
उन फ़ाइलों को जोड़ें जिनमें आप स्विफ्ट कक्षाओं का उपयोग करना चाहते हैं।