আপনি যদি এনামকে একটি কাঁচা ইন্টার মান দেন তবে এটি লুপিংকে আরও সহজ করে তুলবে।
উদাহরণস্বরূপ, আপনি anyGenerator
এমন কোনও জেনারেটর পেতে ব্যবহার করতে পারেন যা আপনার মানগুলি জুড়ে গণনা করতে পারে:
enum Suit: Int, CustomStringConvertible {
case Spades, Hearts, Diamonds, Clubs
var description: String {
switch self {
case .Spades: return "Spades"
case .Hearts: return "Hearts"
case .Diamonds: return "Diamonds"
case .Clubs: return "Clubs"
}
}
static func enumerate() -> AnyGenerator<Suit> {
var nextIndex = Spades.rawValue
return anyGenerator { Suit(rawValue: nextIndex++) }
}
}
// You can now use it like this:
for suit in Suit.enumerate() {
suit.description
}
// or like this:
let allSuits: [Suit] = Array(Suit.enumerate())
তবে এটি দেখতে মোটামুটি সাধারণ প্যাটার্নের মতো মনে হচ্ছে, আমরা কেবল কোনও প্রোটোকল অনুসারে কোনও এনাম টাইপকে গণনার যোগ্য করে তুলতে পারলে কি ভাল লাগবে না? সুইফট ২.০ এবং প্রোটোকল এক্সটেনশানগুলির সাথে ভাল, এখন আমরা পারি!
কেবল আপনার প্রকল্পে এটি যুক্ত করুন:
protocol EnumerableEnum {
init?(rawValue: Int)
static func firstValue() -> Int
}
extension EnumerableEnum {
static func enumerate() -> AnyGenerator<Self> {
var nextIndex = firstRawValue()
return anyGenerator { Self(rawValue: nextIndex++) }
}
static func firstRawValue() -> Int { return 0 }
}
এখন যে কোনও সময় আপনি এনাম তৈরি করবেন (যতক্ষণ না এটির কোনও কাঁচা মূল্য রয়েছে) আপনি প্রোটোকলের সাথে খাঁটি করে এটি গুণনীয় করতে পারেন:
enum Rank: Int, EnumerableEnum {
case Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King
}
// ...
for rank in Rank.enumerate() { ... }
যদি আপনার এনাম মানগুলি 0
(ডিফল্ট) দিয়ে শুরু না হয় তবে firstRawValue
পদ্ধতিটি ওভাররাইড করুন :
enum DeckColor: Int, EnumerableEnum {
case Red = 10, Blue, Black
static func firstRawValue() -> Int { return Red.rawValue }
}
// ...
let colors = Array(DeckColor.enumerate())
প্রতিস্থাপন সহ চূড়ান্ত মামলা বর্গ, simpleDescription
সঙ্গে আরো মান CustomStringConvertible প্রোটোকল , ভালো হবে:
enum Suit: Int, CustomStringConvertible, EnumerableEnum {
case Spades, Hearts, Diamonds, Clubs
var description: String {
switch self {
case .Spades: return "Spades"
case .Hearts: return "Hearts"
case .Diamonds: return "Diamonds"
case .Clubs: return "Clubs"
}
}
}
// ...
for suit in Suit.enumerate() {
print(suit.description)
}
সুইফট 3 সিনট্যাক্স:
protocol EnumerableEnum {
init?(rawValue: Int)
static func firstRawValue() -> Int
}
extension EnumerableEnum {
static func enumerate() -> AnyIterator<Self> {
var nextIndex = firstRawValue()
let iterator: AnyIterator<Self> = AnyIterator {
defer { nextIndex = nextIndex + 1 }
return Self(rawValue: nextIndex)
}
return iterator
}
static func firstRawValue() -> Int {
return 0
}
}