"মারাত্মক ত্রুটি: উদ্দেশ্যটি সি থেকে অ্যারে ব্রিজ করা যায় না" - আপনি এমনকি সুইফ্ট চেষ্টা করছেন কেন?


92

আমি একটি সুইফ্ট প্রোটোকল ঘোষণা করেছি:

protocol Option {
    var name: String { get }
}

আমি এই প্রোটোকলের একাধিক বাস্তবায়ন ঘোষণা করি - কিছু ক্লাস, কিছু এনাম।

আমার কাছে এমন হিসাবে ঘোষণা করা সম্পত্তি সহ একটি ভিউ কন্ট্রোলার রয়েছে:

var options: [Option] = []

যখন আমি এই সম্পত্তিটি Optionঅন্য ভিসির প্রোটোকলটি প্রয়োগ করে এমন একটি বস্তুর অ্যারেতে চেষ্টা করি এবং সেট করি তখন আমি prepareForSegueরানটাইম ত্রুটি পাই:

fatal error: array cannot be bridged from Objective-C

কেন এই কাজ করে না? সংকলকটির প্রয়োজনীয় সমস্ত তথ্য রয়েছে এবং আমি বুঝতে পারি না যে উদ্দেশ্যমূলক-সি এর সাথে আদৌ কী করতে হবে — আমার প্রকল্পে কেবল সুইফট ফাইল রয়েছে এবং এই অ্যারেগুলি কোনও ফ্রেমওয়ার্ক পদ্ধতিতে আসছে না বা আউট হবে না তাদের ব্রিজ করা প্রয়োজন NSArray


6
আপনি কি @objcআপনার প্রোটোকল থেকে প্রিপেন্ড করার চেষ্টা করেছিলেন ? stackoverflow.com/a/28029568/377369
ফ্যাবিও পোলোনি

4
প্রোটোকল বাস্তবায়নের কোনও এনাম হলে এটি কাজ করে না: "নন-ক্লাস টাইপের 'ফু' ক্লাস প্রোটোকল 'অপশন' এর সাথে সামঞ্জস্য করতে পারে না"
রবার্ট অ্যাটকিনস

কেন এটি অবশ্যই ক্লাস প্রোটোকল হওয়া উচিত? আমি এটিকে কোনও ওজজ-সি কাঠামো বা অন্য যে কোনও কিছুতে পাস করছি না যার জন্য সুইফট অ্যারেটি এনএসআরিতে ব্রিজ করা দরকার।
রবার্ট অ্যাটকিনস

তারা সুইফট এবং অবজেক্টিভ-সি এক সাথে কাজ করা এখনও আমার কাছে একটি গোপন বিষয়। আমাকে কেবল অনেকগুলি "গ্রহণ" করতে হবে যা কেবল "কাজ" বা "কাজ করে না"।
ফ্যাবিও পোলোনি

9
কেন এই এক এত এত ডাউনটা আছে? আমার কাছে দেখতে একটি নিখুঁত এবং স্পষ্ট প্রশ্ন।
গুভেন

উত্তর:


83

আমি একটি সমাধান খুঁজে পেয়েছি। এটি বেশ ... অসন্তুষ্টিজনক , তবে এটি কার্যকর হয়। যেখানে আমি করি গন্তব্য দেখার নিয়ামকটিতে অ্যারে সেট করি:

destinationViewController.options = options.map({$0 as Option})

আপনি পুরো অ্যারে নিক্ষেপ করতে পারবেন না? options as [Option]
কোস্টিয়ান্টিন কোভাল

নাহ। এটি চেষ্টা করে (এক্সকোড 6.3.1 (6D1002)) কাজ করে না। আমার এটি কোনও ক্ষেত্রেই কাস্ট করার দরকার নেই , সংকলকটি জানে যে আমি অপশন প্রয়োগ করে এমন একটি অ্যারে পেরিয়ে যাচ্ছি।
রবার্ট অ্যাটকিনস

4
"বিকল্পগুলির একটি অ্যারে যা অপশন কার্যকর করে" আহ, তবে এটি বিকল্পের অ্যারের মতো নয়, যা আপনার প্রয়োজন। আমার উত্তর দেখুন।
ম্যাট

4
এটি কাজ করে এবং হ্যাঁ এটি অত্যন্ত অসন্তুষ্টিজনক ... এটির প্রয়োজন হবে না। সুইচটি এইচটিআইএস পরিচালনা করতে সক্ষম হওয়া উচিত।
অস্কার গোমেজ

আমি সম্মতি দিয়েছি ... এটি এইভাবে কাজ করে তবে এটি কোডের একটি অত্যন্ত সন্তুষ্ট বিট
মাইকেল

22

সংকলক জানে আমি অপশন প্রয়োগ করে এমন একটি অ্যারের মধ্যে যাচ্ছি

আপনি সেখানে একটি খুব উদ্ভাসজনক মন্তব্য পিছলে যেতে দিয়েছেন, যা সমস্যার উত্স প্রস্তাব দেয়। "বিকল্পগুলি প্রয়োগ করে এমন জিনিসগুলির অ্যারে" কোনও বিকল্পের অ্যারে নয়।

সমস্যা ধরণ সাথে আছেন optionsবিন্দু যেখানে আপনি এটি (সৃষ্টি ফিরে prepareForSegue)। আপনি সেই কোডটি দেখান না, তবে আমি বাজি ধরছি যে আপনি সেই মুহুর্তে এটি কাস্ট / টাইপ করতে ব্যর্থ হন। এজন্য অ্যাসাইনমেন্ট ব্যর্থ হয়। optionsঅপশন অবলম্বনে বাস্তবে ঘটে এমন কিছু জিনিসগুলির অ্যারে হতে পারে, তবে এটি যথেষ্ট নয়; এটি অবশ্যই অপশনের অ্যারে হিসাবে টাইপ করতে হবে ।

সুতরাং, ফিরে prepareForSegue, আপনার optionsএই মত ফর্ম :

let options : [Option] = // ... whatever ...

এখন আপনি এটিকে সরাসরি নির্ধারণ করতে সক্ষম হবেন destinationViewController.options

এখানে একটি দ্রুত পরীক্ষার কেস রয়েছে (একটি খেলার মাঠে; আমি খেলার মাঠগুলিকে ঘৃণা করি তবে তাদের ব্যবহার থাকতে পারে):

protocol Option {
    var name : String {get}
}

class ViewController : UIViewController {
    var options : [Option] = []
}

enum Thing : Option {
    var name : String {
        get {
            return "hi"
        }
    }
    case Thing
}

let vc = ViewController()
let options : [Option] = [Thing.Thing]
vc.options = options // no problem

(আমি এটি বাস্তবের সাথে একটি বাস্তব অ্যাপেও পরীক্ষা করেছি prepareForSegueএবং এটি দুর্দান্ত কাজ করে))


4
আমি এই চরম হতাশাগ্রস্থ কারণ কম্পাইলার মনে নেই রানটাইম এ জানি যে জিনিস একটি বিকল্প। এবং যে কোনও ক্ষেত্রে, নীচে আমার নিজের উত্তরের মন্তব্যে যেমন উল্লেখ করা হয়েছে, আপনি এখানে পরামর্শ viewController.options = things as [Option]হিসাবে কাস্টিং ( ) বা স্পষ্টভাবে টাইপ করা কোনও টেম্প ভেরিয়েবল তৈরি করবেন না [Option], আসলে কাজ করে। উভয় ক্ষেত্রেই আমি রানটাইম ত্রুটি পাই।
রবার্ট অ্যাটকিনস

তাহলে আপনাকে ব্যাখ্যা করতে হবে কেন এটি আমার পক্ষে কাজ করে। অন্য কিছু চলছে যা আপনি বর্ণনা করেন নি। আপনি যদি আরও কোড প্রকাশ না করেন তবে আমার কেবল সন্দেহ করতে হবে যে আপনি কোনও প্রয়োজনীয় জিনিসটি আটকে রেখেছেন।
ম্যাট

হতে পারে. তবে প্রথমে ওজেক্টিভ-সি এর সাথে এটির কী সম্পর্ক রয়েছে তা নিয়ে আমি এখনও বিভ্রান্ত হয়েছি (দর্শনার্থে মূল রানটাইম ত্রুটি)) আমি এমন কিছু করছি না (যা আমি দেখতে পাচ্ছি) যা একটি ব্রিজিং কাস্টকে বাধ্য করা উচিত এনএসআরএ।
রবার্ট অ্যাটকিন্স

4
এটাকে এইভাবে দেখ. আমি আপনাকে কোডটি দেখিয়েছি যা কাজ করে। আপনার আছে না আমাকে কোডটি দেখানো না আমি দেওয়া তথ্য থেকে আপনার সমস্যাটি পুনর্গঠন করতে পারবেন না - হবে। আমাকে এটি পুনরুত্পাদন করতে সহায়তা করুন।
ম্যাট

4
@ ক্রিশ্তিবলুță "এই সমস্যাটি এখনও স্থির নয়" দাবি করার আগে আপনার এটি অনুসন্ধান করা দরকার
ম্যাট

16

আমার একই সমস্যা ছিল এবং এটি আমার প্রোটোকলটির সাথে চিহ্নিত করে এটি স্থির করেছিলাম @objc, আপনার ক্ষেত্রে এটি দেখতে এটির মতো দেখাবে

@objc protocol Option {
    var name: String { get }
}

এই উত্তরটি থেকে সমাধান পেয়েছি


4
মূল প্রশ্নের মতামত অনুসারে, প্রোটোকলের কোনও বাস্তবায়নকারী সুইফট এনামস থাকলে এটি কাজ করে না। যা আমার ক্ষেত্রে তারা।
রবার্ট অ্যাটকিন্স

typo obcj এজেজেক্ট হওয়া উচিত
অ্যালান স্কারপা

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