स्विफ्ट में ऑब्जेक्टिव-सी क्लासेस का उपयोग करना
यदि आपके पास एक मौजूदा वर्ग है जिसे आप उपयोग करना चाहते हैं, तो चरण 2 का प्रदर्शन करें और फिर चरण 5 पर जाएं । (कुछ मामलों के लिए, मुझे #import <Foundation/Foundation.h
एक पुरानी उद्देश्य-सी फ़ाइल में एक स्पष्ट जोड़ना था ।)
चरण 1: उद्देश्य-सी कार्यान्वयन जोड़ें - .m
.m
अपनी कक्षा में एक फ़ाइल जोड़ें , और उसे नाम दें CustomObject.m
।
चरण 2: ब्रिजिंग हेडर जोड़ें
अपनी .m
फ़ाइल जोड़ते समय , आप संभवतः एक प्रॉम्प्ट के साथ हिट होंगे जो इस तरह दिखता है:
हाँ पर क्लिक करें !
यदि आपने प्रॉम्प्ट नहीं देखा है, या गलती से अपने ब्रिजिंग हेडर को हटा दिया है, तो .h
अपनी परियोजना में एक नई फ़ाइल जोड़ें और इसे नाम दें <#YourProjectName#>-Bridging-Header.h
।
कुछ स्थितियों में, विशेष रूप से ऑब्जेक्टिव-सी फ्रेमवर्क के साथ काम करते समय, आप स्पष्ट रूप से ऑब्जेक्टिव-सी क्लास नहीं जोड़ते हैं और Xcode लिंकर को नहीं खोज पाते हैं। इस स्थिति में, अपनी .h
फ़ाइल को ऊपर बताए अनुसार बनाएँ , फिर सुनिश्चित करें कि आप अपने लक्ष्य की परियोजना सेटिंग्स में इसका रास्ता लिंक करें:
ध्यान दें:
अपनी परियोजना को $(SRCROOT)
मैक्रो का उपयोग करके लिंक करना सबसे अच्छा अभ्यास है ताकि यदि आप अपनी परियोजना को स्थानांतरित करते हैं, या दूरस्थ रिपॉजिटरी का उपयोग करके दूसरों के साथ काम करते हैं, तो भी यह काम करेगा। $(SRCROOT)
उस निर्देशिका के रूप में सोचा जा सकता है जिसमें आपकी .xcodeproj फ़ाइल है। यह इस तरह लग सकता है:
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
चरण 3: उद्देश्य-सी शीर्षक जोड़ें - .h
एक और .h
फ़ाइल जोड़ें और इसे नाम दें CustomObject.h
।
चरण 4: अपनी उद्देश्य-सी कक्षा बनाएँ
में CustomObject.h
#import <Foundation/Foundation.h>
@interface CustomObject : NSObject
@property (strong, nonatomic) id someProperty;
- (void) someMethod;
@end
में CustomObject.m
#import "CustomObject.h"
@implementation CustomObject
- (void) someMethod {
NSLog(@"SomeMethod Ran");
}
@end
चरण 5: ब्रिजिंग-हेडर में कक्षा जोड़ें
इन YourProject-Bridging-Header.h
:
#import "CustomObject.h"
चरण 6: अपनी वस्तु का उपयोग करें
इन SomeSwiftFile.swift
:
var instanceOfCustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
print(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
स्पष्ट रूप से आयात करने की कोई आवश्यकता नहीं है; ब्रिजिंग हेडर क्या है।
उद्देश्य-सी में स्विफ्ट कक्षाओं का उपयोग करना
चरण 1: नई स्विफ्ट क्लास बनाएं
.swift
अपने प्रोजेक्ट में एक फ़ाइल जोड़ें , और उसे नाम दें MySwiftObject.swift
।
इन MySwiftObject.swift
:
import Foundation
@objc(MySwiftObject)
class MySwiftObject : NSObject {
@objc
var someProperty: AnyObject = "Some Initializer Val" as NSString
init() {}
@objc
func someFunction(someArg: Any) -> NSString {
return "You sent me \(someArg)"
}
}
चरण 2: आयात स्विफ्ट फाइलें ओबीजीसी क्लास के लिए
इन SomeRandomClass.m
:
#import "<#YourProjectName#>-Swift.h"
फ़ाइल: <#YourProjectName#>-Swift.h
पहले से ही अपने प्रोजेक्ट में स्वचालित रूप से बनाई जानी चाहिए, भले ही आप इसे देख न सकें।
चरण 3: अपनी कक्षा का उपयोग करें
MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
NSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];
NSLog(@"RetString: %@", retString);
टिप्पणियाँ:
यदि कोड कंप्लीशन व्यवहार नहीं कर रहा है जैसा कि आप उम्मीद करते हैं, तो ⌘⇧Rस्विफ्ट संदर्भ से कुछ ऑब्जेक्ट-सी कोड खोजने के लिए Xcode की मदद करने के लिए एक त्वरित निर्माण चलाने का प्रयास करें और इसके विपरीत।
यदि आप .swift
किसी पुराने प्रोजेक्ट में फ़ाइल जोड़ते हैं और त्रुटि प्राप्त करते हैं dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
, तो पूरी तरह से Xcode को पुनरारंभ करने का प्रयास करें ।
जबकि मूल रूप से शुद्ध स्विफ्ट कक्षाओं (वंशजों का नहीं NSObject
) का उपयोग करना संभव था जो @objc
उपसर्ग का उपयोग करके उद्देश्य-सी के लिए दिखाई देते हैं , यह अब संभव नहीं है। अब, ऑब्जेक्टिव-सी में दिखाई देने के लिए, स्विफ्ट ऑब्जेक्ट या तो एक वर्ग के अनुरूप होना चाहिए NSObjectProtocol
(ऐसा करने का सबसे आसान तरीका है NSObject
), या कुछ पूर्णांक प्रकार के कच्चे मान के साथ enum
चिह्नित होना । आप इन प्रतिबंधों के बिना स्विफ्ट 1.x कोड के उदाहरण के लिए संपादित इतिहास देख सकते हैं।@objc
Int
@objc