আমি এই সমস্যাটিকে নীচের সাথে তার সহজতম ফর্মটিতে সিদ্ধ করার চেষ্টা করেছি।
সেটআপ
এক্সকোড সংস্করণ 6.1.1 (6A2008a)
একটি এনাম সংজ্ঞায়িত MyEnum.swift
:
internal enum MyEnum: Int {
case Zero = 0, One, Two
}
extension MyEnum {
init?(string: String) {
switch string.lowercaseString {
case "zero": self = .Zero
case "one": self = .One
case "two": self = .Two
default: return nil
}
}
}
এবং কোড যা অন্য ফাইলটিতে এনামকে সূচনা করে MyClass.swift
:
internal class MyClass {
let foo = MyEnum(rawValue: 0) // Error
let fooStr = MyEnum(string: "zero")
func testFunc() {
let bar = MyEnum(rawValue: 1) // Error
let barStr = MyEnum(string: "one")
}
}
ত্রুটি
এক্সকোডটি MyEnum
এর কাঁচা-মান ইনিশিয়ালাইজার দিয়ে আরম্ভ করার চেষ্টা করার সময় আমাকে নিম্নলিখিত ত্রুটি দেয় :
Cannot convert the expression's type '(rawValue: IntegerLiteralConvertible)' to type 'MyEnum?'
মন্তব্য
প্রতি সুইফট ভাষা গাইড :
আপনি যদি কোনও কাঁচা-মান প্রকারের সাথে একটি গণনা সংজ্ঞায়িত করেন তবে গণনাটি স্বয়ংক্রিয়ভাবে একটি সূচনা প্রাপ্ত হয় যা কাঁচা মানের ধরণের (একটি প্যারামিটার হিসাবে পরিচিত
rawValue
) একটি মান নেয় এবং হয় একটি গণনা সদস্যকে বা ফেরত দেয়nil
।ভাষা নির্দেশিকা
MyEnum
থেকে নিম্নলিখিত কেসের কারণে এনামের কাঁচা-মান ইনিশিয়ালাইজারটি সরানো হচ্ছে কিনা তা পরীক্ষা করার জন্য কাস্টম ইনিশিয়ালাইজারটি একটি এক্সটেনশনে সংজ্ঞায়িত করা হয়েছিল । তবে এটি একই ত্রুটির ফলাফল অর্জন করে।নোট করুন যে আপনি যদি কোনও মান ধরণের জন্য একটি কাস্টম ইনিশিয়ালাইজারটি সংজ্ঞায়িত করেন তবে সেই ধরণের জন্য আপনার আর ডিফল্ট আরম্ভকারী (বা সদস্যবিহীন প্রাথমিককরণ, যদি এটি কাঠামো হয়) অ্যাক্সেস পাবেন না। [...]
আপনি যদি নিজের কাস্টম মান প্রকারটি ডিফল্ট আরম্ভকারী এবং সদস্যবিহীন আরম্ভকারী এবং আপনার নিজস্ব কাস্টম ইনিশিয়েলাইজারের সাথে আরম্ভ করতে সক্ষম হন তবে মান প্রকারের আসল বাস্তবায়নের অংশ হিসাবে পরিবর্তে নিজের কাস্টম আরম্ভকারীকে লিখুন।Enum সংজ্ঞা মুভিং করার
MyClass.swift
জন্য ত্রুটি সমাধান করাbar
কিন্তু না করার জন্যfoo
।কাস্টম ইনিশিয়ালাইজার সরানো উভয় ত্রুটি সমাধান করে।
একটি কর্মসূচী হ'ল এনাম সংজ্ঞাতে নিম্নলিখিত ফাংশনটি অন্তর্ভুক্ত করা এবং এটি সরবরাহ করা কাঁচা-মান প্রাথমিককরণের জায়গায় ব্যবহার করা। সুতরাং দেখে মনে হচ্ছে যেন কাস্টম ইনিশিয়ালাইজার যুক্ত করা কাঁচা-মান শুরুর দিকে চিহ্নিত করার অনুরূপ প্রভাব ফেলে
private
।init?(raw: Int) { self.init(rawValue: raw) }
স্পষ্টভাবে করতে প্রোটোকল অনুরূপ ঘোষণা
RawRepresentable
মধ্যেMyClass.swift
জন্য ইনলাইন ত্রুটি সমাধান করাbar
, কিন্তু ডুপ্লিকেট প্রতীক সম্পর্কে একটি linker ভুলবশত ফলাফল (কারণ কাঁচা-মান টাইপ enums পরোক্ষভাবে সাথে সামঞ্জস্যRawRepresentable
)।extension MyEnum: RawRepresentable {}
এখানে কী চলছে সে সম্পর্কে কি কেউ আরও কিছুটা অন্তর্দৃষ্টি দিতে পারেন? কাঁচা-মান প্রাথমিককরণ অ্যাক্সেসযোগ্য নয় কেন?
internal
স্কোপ থাকতে হবে (বা কমপক্ষে টাইপের সাথে মিল রয়েছে), তা নয়private
।