আমি সুইফটে স্ট্রাক্টের জন্য ডিফল্টরূপে কীভাবে সদস্যের প্রারম্ভিককে সর্বজনীন করতে পারি?


164

আমার কাছে একটি সুইফট ফ্রেমওয়ার্ক রয়েছে যা একটি স্ট্রাক্টকে সংজ্ঞায়িত করে:

public struct CollectionTO {
    var index: Order
    var title: String
    var description: String
}

তবে আমি লাইব্রেরি আমদানি করে এমন অন্য প্রকল্প থেকে অন্তর্নিহিত সদস্য বুদ্ধিমান আরম্ভকারী ব্যবহার করতে পারি না। ত্রুটিটি হ'ল 'কালেকশনও' আরম্ভ করা যায় না কারণ এর কোনও অ্যাক্সেসযোগ্য প্রাথমিককরণকারী নেই। অর্থাৎ এটি ডিফল্ট অন্তর্নিহিত সদস্য বুদ্ধিমান আরম্ভকারীকে পাবলিক কীওয়ার্ড দিচ্ছে না।

var collection1 = CollectionTO(index: 1, title: "New Releases", description: "All the new releases")

আমি নিজের মতো করে নিজস্ব পদ্ধতিটি যুক্ত করতে চলেছি:

public struct CollectionTO {
    var index: Order
    var title: String
    var description: String

    public init(index: Order, title: String, description: String) {
        self.index = index;
        self.title = title;
        self.description = description;
    }

}

... তবে আমি চাই না অন্য উপায় আছে যদি কেউ জানেন?

উত্তর:


268

ম্যানুয়ালটি উদ্ধৃত করা হচ্ছে:

"কাঠামোর ধরণের জন্য ডিফল্ট সদস্যবৃত্ত ইনিশিয়ালাইজারগুলি কোনও কাঠামোর ধরণের জন্য ডিফল্ট মেম্বারওয়াস ইনিশিয়ালাইজারটি ব্যক্তিগত হিসাবে বিবেচনা করা হয় যদি কাঠামোর কোনও সঞ্চিত বৈশিষ্ট্য ব্যক্তিগত হয় Otherwise অন্যথায়, আরম্ভকারীটির অভ্যন্তরের একটি অ্যাক্সেস স্তর থাকে।

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

"দ্য সুইফ্ট প্রোগ্রামিং ল্যাঙ্গুয়েজ" , বিভাগ "অ্যাক্সেস নিয়ন্ত্রণ" বিভাগ থেকে উদ্ধৃত অংশ ।


288
ভাল, এটি বিরক্তিকর। :(
ড্যান লোয়েহের্জে

7
[ github.com/apple/swift-evolution/blob/master/proposals/… বলেছেন: "ক্রিস ল্যাটনারকে উদ্ধৃত করে: সুইফ্টের ডিফল্ট মেম্বারওয়াস ইনিশিয়ালাইজার আচরণে কমপক্ষে এই ঘাটতি রয়েছে (আইএমও): ২) অ্যাক্সেস নিয়ন্ত্রণ + সদস্যপদ উদ্যোগ প্রায়শই আপনার নিজের এটি প্রয়োগ করা প্রয়োজন "। সুতরাং এটি সম্ভবত একটি অভাব যা বিশেষত কোনও কারণ ছাড়াই বিদ্যমান। এই সম্পর্কে আরও রেফারেন্স খুঁজে পাওয়া যায় নি।
জানো

8
@ ড্যানলয়েউনহের্জ হ্যাঁ এটি অসুবিধাজনক। যুক্তিটি হ'ল: "জনসাধারণের সদস্য না হয়ে অভ্যন্তরীণ সদস্যদের পাবলিক টাইপ ডিফল্ট। আপনি যদি কোনও টাইপ সদস্যকে সর্বজনীন হতে চান তবে আপনাকে অবশ্যই এটি স্পষ্টভাবে চিহ্নিত করতে হবে। এই প্রয়োজনীয়তাটি নিশ্চিত করে যে কোনও ধরণের জনসাধারণের মুখোমুখি এপিআই হ'ল এমন কিছু যা আপনি প্রকাশের ক্ষেত্রে বেছে নিয়েছেন এবং ভুলরূপে কোনও প্রকারের অভ্যন্তরীণ কাজগুলি পাবলিক এপিআই হিসাবে উপস্থাপন করা এড়িয়ে চলে। " এর উত্স: অ্যাপল ইনক। "দ্য সুইফ্ট প্রোগ্রামিং ভাষা।" iBooks। itun.es/gb/jEUH0.l
বান্দেজপাইসা

18
একটি সংকলক নির্দেশিকা ডিফল্ট আচরণকে ওভাররাইড করতে এবং এটি সর্বজনীন করা ভাল nice
বান্দেজপাটাইস

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

72

কমপক্ষে আপনি নিম্নলিখিত পদক্ষেপের সাহায্যে একটি দ্রুত তৈরি করতে পারেন:

  1. স্ট্রাক্টের পরিবর্তে অস্থায়ীভাবে বস্তুকে শ্রেণিবদ্ধ করুন
  2. সংরক্ষণ
  3. শ্রেণীর নামটিতে ডান ক্লিক করুন এবং অশোধক -> সদস্যবৃত্ত ইনিশিয়ালাইজার উত্পন্ন করুন choose
  4. এটি আবার স্ট্রাক্টে পরিবর্তন করুন

উজ্জ্বল। এই দ্রুততম
ঘাটতিটি ঘটিয়ে


এটি একটি সুপার টিপ !!
পিলেখ

6
এক্সকোড 11 হিসাবে, আপনি স্ট্রাইকগুলিতে জেনারেট মেনুইজ ইনিশিয়ালাইজারটিও ব্যবহার করতে পারেন!
ব্রুক বাটসেল

ফ্যান্টাস্টিক !!! এটি সঠিক উত্তর নয়, তবে একটি খুব ভাল টিপ! আমাকে অনেক সাহায্য করেছে!
গুইস

3

যতক্ষণ না অ্যাপল এটিকে পরিবর্তন করে এবং কম বিরক্তিকর করে তোলে ততক্ষণ আপনি https://github.com/Bouke/SwiftInitializerGenerator (বা অন্য কোনও) পাবলিক আরম্ভকারীদের তৈরির জন্য এই জিনিসটি ব্যবহার করতে পারেন । সুতরাং এটি কম কাজ হবে। চেষ্টা করে দেখে কাজ করে works এক্সকোড সংস্করণ 10.0, উচ্চ সিয়েরা 10.13.6


1

আমাদের কাছে এখন একটি রুবি রত্ন রয়েছে a একটি সম্পূর্ণ সুইফ্ট ডেটা মডেল ফাইল, লাইন-বাই-লাইন, এবং পাবলিক অ্যাক্সেস সংশোধক, পাবলিক সদস্য-বুদ্ধিমান ডিফল্ট ইনিশিয়ালাইজারস এবং অন্যান্য জিনিস পৃথক স্বতঃ উত্পাদিত আউটপুট সুইফ্ট ফাইলটিতে যুক্ত করার জন্য rub

এই রত্নটিকে সুইফট_প্রজাতন্ত্র বলা হয়

এই রত্নটি চালনার জন্য দয়া করে নীচের নথিগুলি দেখুন:

https://github.com/mehul90/swift_republic


1
অসাধারণ সমাধান !! আমি ইতিমধ্যে একটি মোড়ক তৈরি করেছি swift_republicএবং ঠিকঠাক কাজ করছি।
মোঃ শাহেদ হোসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.