ক্লাসে উদ্দেশ্য-সি কোড কল সুইফট এক্সটেনশন?


100

আমি কিছু পোস্ট অনুসন্ধান করেছি, আমি মনে করি আমি দ্রুতগতির অধীনে কোনও এক্সটেনশন লিখতে পারি না এবং এটি উদ্দেশ্য - সি কোড থেকে কল করতে পারি, তাই না?

@objc এর মত বৈশিষ্ট্যগুলি কেবল পদ্ধতি, শ্রেণি, প্রোটোকলকে সমর্থন করে?


4
কেন আপনি শুধু চেষ্টা করে দেখুন না?
রয়েছে

7
আদর্শ অভিযোগ করেছে ত্রুটি, তবে আমি একটি নির্দিষ্ট নোঙ্গর পেতে চাই।
স্প্রভাক

উত্তর:


88

আপনি একটি সুইফট এক্সটেনশন লিখতে পারেন এবং এটি উদ্দেশ্য-সি কোডে ব্যবহার করতে পারেন। এক্সকোড 6.1.1 দিয়ে পরীক্ষিত।

আপনাকে যা করতে হবে তা হ'ল:

  • সুইফটে আপনার এক্সটেনশনটি তৈরি করুন ( @objcসুইফট ৩.০.৩ থেকে টিকা প্রয়োজন)

  • #import "ProjectTarget-Swift.h" আপনার অবজেক্টিভ-সি ক্লাসে (যেখানে "প্রজেক্টট্যাজেট" এক্সকোড টার্গেট উপস্থাপন করে যার সাথে সুইফট এক্সটেনশনটি যুক্ত রয়েছে)

  • সুইফট এক্সটেনশন থেকে পদ্ধতিগুলি কল করুন


6
আমি ঠিক এটি করেছি কিন্তু এটি এখনও একটি সংকলন সময়ের ত্রুটি। হুমমম। সম্পাদনা: আমি আমার ব্রিজিং শিরোনামটি "প্রজেক্টট্যাজেট-সুইফট। एच" এর পরিবর্তে আমদানি করেছি । ডের
জেসন রেনালদো

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

উইলিয়াম হু, দেখুন ম্যাক্লাউলিংঞ্জের উত্তর!
আপেলাইটং

39
সুইফট ৩.০.৩ অনুসারে, আপনি যদি ওজেক্টিভ সি শ্রেণীর ফাইলগুলিতে এক্সটেনশনটি ব্যবহার করতে চান তবে @objc টিকা প্রয়োজন।
রিজওয়ান আহমেদ

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

70

আমি জানতে পেরেছিলাম যে সুইফট 4.0.০ এ আমি @objcআমার এক্সটেনশান কীওয়ার্ডের সামনে যুক্ত করতে হয়েছিল যাতে আমি ওবিজেসি ক্লাসটি প্রসারিত করছিলাম তা দিয়ে সুইফট এক্সটেনশন পদ্ধতিগুলি দৃশ্যমান হয়।

সংক্ষেপে:

ফাইল কনফিগারেশন সেটআপ:

CustomClass.h
CustomClass.m
CustomClassExtension.swift

কাস্টম ক্লাস এক্সটেনশনে:

@objc extension CustomClass
{
    func method1() 
    {
        ...
    }
}

আমার AppDelegate.m এ:

self.customClass = [[CustomClass alloc] init];
[self.customClass method1];

4
যদি কোনও পদ্ধতি জেনেরিক ব্যবহার করে তবে এটি উদ্দেশ্য-সি দ্বারা ব্যবহার করা যাবে না এবং আপনাকে @nonobjcএনেটেশন যুক্ত করতে হবে ।
টমাসডাব্লু

কেবলমাত্র একটি সিডনোট, @objcMebers এই ক্ষেত্রে কাজ করে না। কেন জানি না .. :-(
রুনক

48

এই দ্রবণটি সুইফট ২.২ এবং সুইফ্ট 3 এর জন্য কাজ করে । মনে রাখবেন যে ক্লাসগুলির জন্য কেবল এক্সটেনশনগুলি (স্ট্রাক্ট বা এনামগুলির জন্য নয়) অবজেক্টিভ-সি থেকে অ্যাক্সেসযোগ্য হবে।

import UIKit

extension UIColor {

    //Custom colours
    class func otherEventColor() -> UIColor {
        return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
    }
}

তারপরে আপনার ObjC ফাইলে # পণ্য "ModDuleName-Swift.h" বিকাশ করুন।

সুইফট 4

extension UIColor {

    // As of Swift 4.0.3, the @objc annotation is needed if you want to use the extension in Objective-C files
    @objc
    class func otherEventColor() -> UIColor {
        return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
    }
}

এটি "আপনারপ্রজেক্টসনেম হেরে ..." নয় বরং "আপনারতারাজেটনেম হেরে ...": লক্ষ্যগুলি ভাগ করতে আপনাকে নামটি লক করতে হবে: dr2050.postach.io/post/…
ড্যান রোজনস্টার্ক

4
নিবন্ধন করুন অ্যাপলের পরামর্শ অনুসারে আমি এটিকে "প্রোডাক্টমডিউলনেম-সুইফট.h" এ পরিবর্তন করছি: বিকাশকারী.অ্যাপল.
ফোটি

4
দ্রুত 3 এর জন্য সূক্ষ্মভাবে কাজ করে
ভিক্টর কুচেরা

আপনি বলার publicদরকার আছে এমন কোনও কারণ আছে ? publicআমার জন্য পরিবর্তনকারী ছাড়াই সূক্ষ্ম কাজ করে । আমরা কি ধরে নিচ্ছি যে এক্সটেনশানটি একই প্রকল্পে নয় বরং অন্য প্রকল্প থেকে আমদানি হচ্ছে?
লি কাং

ব্রিজিং শিরোলেখ ব্যবহার করার দরকার কি?
jegadeesh

42

অন্যান্য উত্তরে কভার হিসাবে, উত্পন্ন সুইফট শিরোনামটি আমদানি করা বেশিরভাগ ক্ষেত্রেই কাজ করে

এর ব্যতিক্রম হ'ল যখন একটি ব্রিজযুক্ত ধরণের (যেমন এক্সটেনশানটি সংজ্ঞায়িত করা হয় Stringএবং না NSString) উপর সংজ্ঞা দেওয়া হয় । এই বিভাগগুলি স্বয়ংক্রিয়ভাবে তাদের উদ্দেশ্য-সি অংশগুলিতে ব্রিজ করা হবে না। এটি পেতে, আপনাকে হয় উদ্দেশ্য-সি প্রকারটি ব্যবহার করতে হবে (এবং আপনার স্যুইফ্ট কোডের সাথে রিটার্নের মানটি প্রেরণ করতে হবে as String) বা সুইফট এবং অবজেক্টিভ-সি উভয় প্রকারের জন্য একটি এক্সটেনশনটি সংজ্ঞায়িত করতে হবে।


4
উপরের উত্তরে যুক্ত করে, আপনার নিজের দ্রুতগতি সম্প্রসারণটি সর্বজনীন করা উচিত এবং এনএসএসট্রিং হিসাবে এর প্রকার সেট করা উচিত public extension NSString। সংকলনের সময় আপনি যদি কোনও অমীমাংসিত শনাক্তকারী বা অনুরূপ ত্রুটি পেয়ে থাকেন তবে আপনি আবার let sVal = self as StringsVal
স্ট্রিংয়ের

@ রুনলুপ আসলে আপনার জনসাধারণের দরকার নেই, এটি স্কোপ সুনির্দিষ্ট ছাড়াই কাজ করবে। এবং এটি (ওবজ-সি-তে রফতানির অর্থ) স্ট্রিংসের জন্য কাজ করে না, কারণ তারা স্ট্রাক্ট, ক্লাস নয় এবং কেবল সুইফ্ট থেকে উপলব্ধ। সুতরাং, হ্যাঁ - আপনি এনএসএসটিংয়ের জন্য এক্সটেনশন লিখতে পারেন এবং কাস্ট ব্যবহার করতে পারেন, বা mclaughlinj
এনএসট্রিং

3

অবজেক্টিভি-সি ফাইলটিতে "# ইমপোর্ট " প্রোডাক্টমডিউলনেম-সুইফট। एच "শিরোনামটি আমদানি করুন এবং সুইট ফাইলে আপনার এক্সটেনশনের @objc ইনফ্রন্ট যুক্ত করুন It এটি সুইফট 4.2 এবং সুইফট 5 এ সূক্ষ্মভাবে কাজ করবে


0

যদি আপনি মনে করেন যে আপনি সবকিছু সঠিকভাবে কনফিগার করেছেন (আপনার সুইফট সত্ত্বাকে @objcMeumber বা @objc দিয়ে চিহ্নিত করেছেন, ব্রিজিং শিরোনাম "ProductModuleName-Swift.h" ইত্যাদি আমদানি করেছেন) - তবে তবুও No visible @interface for 'FooClass' declares the selector 'fooSelector'ত্রুটিটি পেয়েছে :

চেক করলে গণনার জমকালো অনুষ্ঠান হেডারের মধ্যে আপনার ইন্টারফেসগুলি দেখতে দ্বারা ctrl + cmdএটি ক্লিক। যদি আপনি তা না করেন তবে এই প্রশ্নের আমার উত্তরটি দেখুন: সুইফট টু অবজেক্টিভ-সি শিরোনামে সুইফ্ট ক্লাস নেই

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