ওবজে-সি-তে সুইফটের এনাম ব্যবহার করা কি সম্ভব?


145

আমি আমার কিছু ওজ-সি শ্রেণিকে সুইফটে রূপান্তর করার চেষ্টা করছি। এবং অন্য কিছু ওজজ-সি ক্লাস এখনও সেই রূপান্তরিত শ্রেণিতে এনাম ব্যবহার করছে। আমি প্রাক-প্রকাশের দস্তাবেজগুলিতে অনুসন্ধান করেছি এবং এটি খুঁজে পেলাম না বা আমি এটি মিস করেছি। ওবজে-সি ক্লাসে সুইফট এনাম ব্যবহার করার কোনও উপায় আছে কি? বা এই ইস্যুটির ডকের একটি লিঙ্ক?

এইভাবে আমি আমার পুরাতন ওবজ-সি কোড এবং নতুন সুইফ্ট কোডটিতে আমার এনাম ঘোষণা করলাম।

আমার পুরানো ওবজে-সি কোড:

typedef NS_ENUM(NSInteger, SomeEnum)
{
    SomeEnumA,
    SomeEnumB,
    SomeEnumC
};

@interface SomeClass : NSObject

...

@end

আমার নতুন সুইফট কোড:

enum SomeEnum: NSInteger
{
    case A
    case B
    case C
};

class SomeClass: NSObject
{
    ...
}

আপডেট: উত্তর থেকে। এটি 1.2 এর চেয়ে পুরানো সংস্করণে সুইফটে করা যায় না। তবে এই অফিশিয়াল সুইফ্ট ব্লগ অনুসারে । এক্সকোড .3.৩ সহ প্রকাশিত সুইফট ১.২-এ, আপনি @objcসামনের দিকে যুক্ত করে অবজেক্টিভ-সিতে সুইফট এনাম ব্যবহার করতে পারেনenum


আপনার বিদ্যমান কোডটি বদলে দেওয়ার দরকার নেই। সুইফট এবং অবজেক্টিভ-সি এর মধ্যে কথোপকথনের জন্য, ডাব্লুডাব্লুডিসি ভিডিও দেখুন।
gnasher729

ভবিষ্যতে আমার প্রকল্পে একটি সুইফ্ট শ্রেণি আছে কিনা তা আমার প্রকল্পটি এখনও কাজ করে কিনা তা আমি খতিয়ে দেখতে চাই তবে এটি পরীক্ষা করার জন্য আমার কোন শ্রেণি যুক্ত করা উচিত তা আমি বুঝতে পারি না। সুতরাং, আমি পরিবর্তে পুরানো এক রূপান্তর। যাহাই হউক না কেন, আপনার সাহায্যের জন্য ধন্যবাদ।
myLifeasdog

উত্তর:


226

সুইফট সংস্করণ হিসাবে 1.2 (এক্সকোড 6.3) আপনি করতে পারেন। কেবল এনাম ঘোষণার সাথে উপসর্গ করুন@objc

@objc enum Bear: Int {
    case Black, Grizzly, Polar
}

নির্লজ্জভাবে সুইফ্ট ব্লগ থেকে নেওয়া হয়েছে

দ্রষ্টব্য: এটি স্ট্রিং এনাম বা সংশ্লিষ্ট মান সহ এনামগুলির জন্য কাজ করবে না। আপনার এনামটি আন্তঃসীমাবদ্ধ হতে হবে


অবজেক্টিভ-সিতে এটির মতো দেখাবে

Bear type = BearBlack;
switch (type) {
    case BearBlack:
    case BearGrizzly:
    case BearPolar:
       [self runLikeHell];
}

8
এটিকে নির্দেশ করার জন্য অনেক ধন্যবাদ ... লক্ষ্য করুন যে উদ্দেশ্য-সিতে যদিও এনাম মানগুলি কল হবে BearBlack, BearGrizzlyএবং BearPolar!
nburk

1
কোন মানে নেই? বিশেষত আপনি যখন দেখুন যে এটি কীভাবে আপত্তি-সি থেকে দ্রুত রূপান্তরিত হয়েছে .. @ এনবার্ক
ড্যানিয়েল গালাসকো

1
হ্যাঁ, এটি কাজ করে। তবে কমপক্ষে আমার ক্ষেত্রে প্রকল্পের উদ্দেশ্য-সি দিকের অ্যাক্সেসযোগ্য হওয়ার জন্য একটি গণ্যকারী গুণাবলীকে গণনার সাথে যুক্ত করতে হয়েছিল, যেমন: "@jjc পাবলিক এনাম বিয়ার: ইন্ট"
পিরক্কা এস্কো

খুব খারাপ আমি কোনও প্রমাণ দেখতে পাচ্ছি না যে সুইফট এনাম সম্পর্কিত মানগুলি সম্ভব। ইচ্ছুক চিন্তাভাবনা
ফিনিউকেহেল্প

2
@ আজিত আপনি কেন এটি করতে চান? এনামকে তার নিজস্ব শিরোনামে কেবল যুক্ত করুন এবং ব্রিজিং শিরোনামে এটি আমদানি করুন অন্যথায় এটি সুইফটের কাছে একচেটিয়া
ড্যানিয়েল গালাস্কো

31

নির্বাচিত উত্তরে প্রসারিত করতে ...

সুইফট এবং অবজেক্টিভ-সি ব্যবহার করে সুইফট স্টাইলের এনামগুলি ভাগ করা সম্ভব NS_ENUM()

এগুলি কেবল একটি উদ্দেশ্য-সি প্রসঙ্গে ব্যবহার করে সংজ্ঞায়িত করা দরকার NS_ENUM()এবং এগুলি সুইফট ডট স্বরলিপি ব্যবহার করে উপলব্ধ করা হয়।

কোকো এবং অবজেক্টিভ-সি সহ ইউজিং সুইফ্ট থেকে

একটি সুইফট গণনা হিসাবে সুইফট আমদানি NS_ENUMম্যাক্রোর সাথে চিহ্নিত যে কোনও সি-শৈলীর গণনা । এর অর্থ হ'ল অঙ্কের মান নামগুলির উপসর্গগুলি যখন তারা সুইফটে আমদানি করা হয়, তারা সিস্টেম ফ্রেমওয়ার্কে বা কাস্টম কোডে সংজ্ঞায়িত হয়ে গেলে তারা কেটে যায়।

উদ্দেশ্য গ

typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
   UITableViewCellStyleDefault,
   UITableViewCellStyleValue1,
   UITableViewCellStyleValue2,
   UITableViewCellStyleSubtitle
};

দ্রুতগতি

let cellStyle: UITableViewCellStyle = .Default

আমি ইউআইটিএবলভিউসিল স্টাইলে পেয়েছি "ফাংশন সংজ্ঞা এখানে অনুমোদিত নয়", আমি কী ভুল করছি? অবশ্যই আমার আলাদা আলাদা নাম রয়েছে ইউআইটিএবল ভিউসেল স্টাইল নয়।
ক্রিশ্তি বালু

1
মিঃ গালাসকো নীচে জবাব হিসাবে উল্লিখিত হয়েছে, সুইফট ১.২ এনামগুলিকে সুইফটে সংজ্ঞায়িত করতে এবং ওবজে-সি তে উপলব্ধ করার অনুমতি দেয়। এই শৈলীর সংজ্ঞা, যথা এনএস_ইউএনএম, এখনও ওবজে-সি তে কাজ করে তবে সুইফ্ট সংস্করণ ১.২ অনুসারে আপনি যে কোনও বিকল্প ব্যবহার করতে পারেন।
স্যারনড

আমি দেখতে পেয়েছি যে সুইফটে ওবিজেসি এনামগুলিতে একটি সমস্যা আছে: সেগুলি অনুপলব্ধ। if let a = MyEnum(rawValue: 12345)12345 যে এনামের অংশ নয় এমন একটি খণ্ডে , ফলাফলটি optionচ্ছিক নয় তবে কিছু অবৈধ এনাম।
বায়ো

30

কোকো এবং উদ্দেশ্য-সি গাইড সহ ইউজিং সুইফট থেকে :

অ্যাক্সেসযোগ্য এবং উদ্দেশ্য-সিতে ব্যবহারযোগ্য হওয়ার জন্য একটি সুইফ্ট ক্লাস বা প্রোটোকল অবশ্যই @objc বৈশিষ্ট্যের সাথে চিহ্নিত করতে হবে। [...]

অবজেক্টিভ-সি এর সাথে সামঞ্জস্য হওয়া অবধি @objc অ্যাট্রিবিউটের সাথে চিহ্নিত কোনও শ্রেণি বা প্রোটোকলের মধ্যে আপনার কাছে অ্যাক্সেস থাকবে। এটি এখানে তালিকাভুক্ত হিসাবে সুইফট-কেবল বৈশিষ্ট্যগুলি বাদ দেয়:

জেনেরিক্স টিপলস / সুইফট / স্ট্রাকচারগুলিতে সংজ্ঞা সংজ্ঞাটি সুইফট / গ্লোবাল ভেরিয়েবলগুলিতে সুইফ্ট / টাইপালিয়াসে সংজ্ঞায়িত সুইফট / সুইফট-স্টাইলের ভেরিয়েডিকস / নেস্টেড টাইপ / ক্রিড ফাংশনগুলিতে সংজ্ঞায়িত

সুতরাং, না, আপনি একটি উদ্দেশ্য-সি শ্রেণিতে একটি সুইফট এনাম ব্যবহার করতে পারবেন না।


2
এখানে কি কাজ আছে? মানে আমি যদি একটি সুইফ্ট ক্লাস তৈরি করি এবং আমার একেবারে এনাম দরকার। আমি কীভাবে সেই এনামকে উদ্দেশ্যমূলক-সি-তে ব্যবহারযোগ্য করে তুলতে পারি?
রাউল লোপেজ

4
@ রওললোপেজভিলালপ্যান্ডো আপনি যদি জানেন যে আপনি উদ্দেশ্য-সি এর সাথে আন্তঃব্যবস্থাপনা করতে চলেছেন, তবে আপনাকে উদ্দেশ্য-সিতে অঙ্কটি ঘোষণা করতে হবে এবং উভয় ভাষায় এটি ভাগ করে নেওয়া উচিত।
গ্রেগরি হিগলি

3
"হ্যাঁ তাই আমরা এই ব্রিজটি আপনাকে সুইফটে রূপান্তর করতে সহায়তা করার জন্য তৈরি করেছিলাম, তবে আপনি যদি এনামস, স্ট্রাক্টস, জেনেরিক্সের মতো শীতল কিছু ব্যবহার করতে চান তবে তা বেহুদা ..."
কেভিন আর

22
এই উত্তরটি আর লম্বা নয়! @objcএক্সকোড .3.৩ / সুইফট ১.২ থেকে, সুইফট এনামগুলি @ ড্যানিয়েল গ্যালাসকো নীচে তার উত্তরে উল্লেখ করেছেন বলে উদ্দেশ্য-সি এর মধ্যেও ব্যবহার করা যেতে পারে !!!
nburk

9
কেবল উপরের মন্তব্যটি স্পষ্ট করতে, ডকুমেন্টেশনের বর্তমান পাঠ্যটিকে উদ্ধৃতি ২.১ হিসাবে , "ইন কাঁচা মানের প্রকার ব্যতীত সুইফ্টে সংজ্ঞায়িত পরিসংখ্যান" হিসাবে উদ্ধৃত করা হয়েছে । সুতরাং, যদি আপনার সুইফ্টের এনামটি পূর্বের @obj enum MyEnum: Intহিসাবে উল্লিখিত অবজেক্টিভ-সি ফাইলগুলিতে কোনও ইন্ট কাঁচা মান ধরণের হিসাবে ঘোষিত হয় । যদি আপনার এনাম যেমন অন্য কোনও কাঁচা মান ধরণের হিসাবে ঘোষিত হয় তবে @obj enum MyOtherEnum: Stringআপনি এটি উদ্দেশ্য-সি ফাইলগুলিতে ব্যবহার করতে সক্ষম হবেন না
jjramos

7

সুইফট 4.1, এক্সকোড 9.4.1:

1) সুইফট এনাম অবশ্যই প্রিফিক্স করা উচিত @objc এবং Intটাইপ :

// in .swift file:
@objc enum CalendarPermission: Int {
    case authorized
    case denied
    case restricted
    case undetermined
}

2) উদ্দেশ্য-সি নামটি এনাম নাম + কেসের নাম, যেমন CalendarPermissionAuthorized:

// in .m file:
// point to something that returns the enum type (`CalendarPermission` here)
CalendarPermission calPermission = ...;

// use the enum values with their adjusted names
switch (calPermission) {
    case CalendarPermissionAuthorized:
    {
        // code here
        break;
    }
    case CalendarPermissionDenied:
    case CalendarPermissionRestricted:
    {
        // code here
        break;
    }
    case CalendarPermissionUndetermined:
    {
        // code here
        break;
    }
}

এবং অবশ্যই, আপনার সুইফট ব্রিজিং শিরোনামটি অবজেক্টিভ-সি ফাইলের আমদানি তালিকার শেষ আইটেম হিসাবে আমদানি করতে ভুলবেন না:

#import "MyAppViewController.h"
#import "MyApp-Swift.h"

মাই অ্যাপ-সুইফ্টটি শেষ হওয়া উচিত কেন?
পল টি।

@PaulT। : সম্ভবত প্রক্রিয়া ক্রম সঙ্গে করতে হবে। এটি অন্য কোথাও রাখার চেষ্টা করুন এবং আপনি দেখতে পাবেন এটি কার্যকর হবে না।
লেন

আমি চেক করেছিলাম, আমার বর্তমান প্রকল্পে প্রায় সব ফাইলেই এটি আমদানি বিভাগের শেষে, তবে বেশ কয়েকটি ফাইলে এটি শেষ হয় না এবং প্রকল্পটি কাজ করে না। এটি একটি নতুন এক্সকোডে থাকতে পারে এটি কাজ করে? আমি এখনই এটি পরীক্ষা করতে পারছি না, কারণ আমার বর্তমান প্রকল্পটি সংকলিত হতে যুগে যুগে সময় লাগে :) তবে আমি পরে এটি যাচাই করতে যাচ্ছি
পল টি।

2

যদি আপনি ওবিজেসি কোডগুলি যেমন হয় তেমন রাখতে পছন্দ করেন তবে আপনি আপনার প্রকল্পে একটি সহায়ক শিরোনাম ফাইল যুক্ত করতে পারেন:

Swift2Objc_Helper.h

হেডার ফাইলটিতে এই এনাম টাইপ যুক্ত করুন:

typedef NS_ENUM(NSInteger, SomeEnum4ObjC)
{
   SomeEnumA,
   SomeEnumB
};

পরিবর্তন করতে আপনার .m ফাইলে অন্য কোনও জায়গা থাকতে পারে: লুকানো শিরোনাম ফাইলটি অন্তর্ভুক্ত করতে:

#import "[YourProjectName]-Swift.h"

আপনার প্রকল্পের নামের সাথে [আপনারপ্রজেক্টনাম] প্রতিস্থাপন করুন। এই শিরোনামের ফাইলটি ওবজেসি-তে সমস্ত সুইফ্ট সংজ্ঞায়িত @objc ক্লাস উন্মুক্ত করে।

আপনি অঙ্কের ধরণ থেকে অন্তর্ভুক্ত রূপান্তর সম্পর্কে একটি সতর্কতা বার্তা পেতে পারেন ... এটি ঠিক আছে।

যাইহোক, আপনি এই শিরোলেখ হেল্পার ফাইলটি কিছু ওবিজেসি কোড যেমন # ডিফাইন কনস্ট্যান্ট রাখতে রাখতে ব্যবহার করতে পারেন।


0

আপনি যদি (আমার মতো) সত্যই স্ট্রিং এনাম ব্যবহার করতে চান তবে আপনি উদ্দেশ্য-সি এর জন্য একটি বিশেষ ইন্টারফেস তৈরি করতে পারেন। উদাহরণ স্বরূপ:

enum Icon: String {
    case HelpIcon
    case StarIcon
    ...
}

// Make use of string enum when available:
public func addIcon(icon: Icon) {
    ...
}

// Fall back on strings when string enum not available (objective-c):
public func addIcon(iconName:String) {
    addIcon(Icon(rawValue: iconName))
}

অবশ্যই, এটি আপনাকে অটো-সম্পূর্ণ করার সুবিধা দেয় না (যদি আপনি উদ্দেশ্য-সি পরিবেশে অতিরিক্ত ধ্রুবকগুলি সংজ্ঞায়িত না করেন)।


0

এটি আরও কিছুটা সাহায্য করতে পারে

সমস্যা বিবৃতি : - আমি সুইফ্ট ক্লাসে ভর্তি হয়েছি, যা আমি অন্যান্য সুইফ্ট ক্লাসে অ্যাক্সেস করছি এবং এখন এটির অ্যাক্সেসের প্রয়োজন আমার উদ্দেশ্য সিটির একটি।

উদ্দেশ্য-সি শ্রেণি থেকে এটি অ্যাক্সেস করার আগে:

enum NTCType   {
    case RETRYNOW
    case RETRYAFTER
}
 var viewType: NTCType? 

উদ্দেশ্য সি শ্রেণি থেকে এটি অ্যাক্সেসের জন্য পরিবর্তনগুলি

@objc  enum NTCType :Int  {
    case RETRYNOW
    case RETRYAFTER
}

এবং এটিতে মানটি পাস করার জন্য একটি ফাংশন যুক্ত করুন

  @objc  func setNtc(view:NTCType)  {
        self.viewType = view; // assign value to the variable
    }

0

এটি গবেষণা করার পরে, আমি কেবল আংশিক উত্তরগুলি সন্ধান করতে থাকি, সুতরাং আমি উদ্দেশ্যমূলক সিতে একটি সুইফট অ্যাপের একটি সম্পূর্ণ উদাহরণ তৈরি করেছি যাতে উদ্দেশ্যটি সি কোড দ্বারা ব্যবহৃত সুইফট এনাম এবং সুইফট কোড দ্বারা ব্যবহৃত উদ্দেশ্যমূলক সি এনাম রয়েছে। এটি একটি সাধারণ এক্সকোড প্রকল্প যা আপনি চালাতে এবং পরীক্ষা করতে পারেন। এটি সুইফট 5.0 এর সাথে এক্সকোড 10.3 ব্যবহার করে লেখা হয়েছিল

উদাহরণ প্রকল্প


আমি দেখতে পাচ্ছি না, যেখানে আপনার প্রকল্পটি enum SwAnimal@obj
সিটি সিলেটে সুইফট এনাম ব্যবহার করে en

0

আপনি যদি এমন কোনও এনাম পর্যবেক্ষণ করার চেষ্টা করছেন যা দেখতে এইরকম দেখাচ্ছে:

enum EnumName: String {
    case one = "One"
    case two = "Two"
}

এই কাজটি আমাকে সাহায্য করেছিল।

পর্যবেক্ষণযোগ্য শ্রেণি:

  • সৃষ্টি @objc dynamic var observable: String?
  • আপনার এনাম উদাহরণটি এটি তৈরি করুন:

    private var _enumName: EnumName? {
        didSet {
            observable = _enumName!.rawValue
        }
    }

পর্যবেক্ষক শ্রেণি:

  • সৃষ্টি private var _enumName: EnumName?
  • সৃষ্টি private let _instance = ObservableClass()
  • সৃষ্টি

    private var _enumObserver: NSKeyValueObservation = _instance.observe(\.observable, options: .new, changeHandler: { [weak self] (_, value) in
        guard let newValue = value.newValue else { return }
        self?._enumName = EnumName(rawValue: period)!
    })

এর চেয়ে বেশি এখন প্রতিবার আপনি পরিবর্তন_enumName পর্যবেক্ষণযোগ্য শ্রেণিতে , পর্যবেক্ষক শ্রেণীর জন্য একটি উপযুক্ত উদাহরণ তত্ক্ষণাত আপডেট করা হবে।

এটি অবশ্যই একটি বৃহত্তর বাস্তবায়ন, তবে কেভিও-অসম্পূর্ণ বৈশিষ্ট্যগুলি কীভাবে পর্যবেক্ষণ করা যায় সে সম্পর্কে আপনাকে ধারণা দেওয়া উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.