enum Suit: String {
case Spades = "黑桃"
case Hearts = "紅桃"
case Clubs = "草花"
case Diamonds = "方片"
}
enum Rank: Int, CustomStringConvertible {
case Ace = 1
case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
case Jack, Queen, King
var description: String {
switch self {
case .Ace: return "A"
case .Jack: return "J"
case .Queen: return "Q"
case .King: return "K"
default:
return String(self.rawValue)
}
}
}
protocol EnumeratableEnumType {
//在protocol里定義一個類型域上的方法或者計算屬性時,使用static進行定義;
//Self表示實現了EnumeratableEnumType協議的類型以及子類
static var allValues: [Self] { get }
}
extension Suit: EnumeratableEnumType {
static var allValues: [Suit] {
return [.Spades, .Hearts, .Clubs, .Diamonds]
}
}
extension Rank: EnumeratableEnumType {
static var allValues: [Rank] {
return [.Ace, .Two, .Three, .Four, .Five, .Six, .Seven, .Eight, .Nine, .Ten, .Jack, .Queen,.King];
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//MARK: - Enum Test
for suit in Suit.allValues {
for rank in Rank.allValues {
print("\(suit.rawValue)\(rank)")
}
}
}
}
static和class的使用Tips
在struct和enum這兩個值類型中,我們可以使用static在類型范圍內聲明并使用存儲屬性,計算屬性和方法
在protocol里可以使用static定義一個類型域上的方法或者計算屬性
class關鍵字專門用在class類型的上下文中,可以用來修飾類方法和計算屬性,但是不能用來修飾存儲屬性,存儲屬性應該使用static來聲明
總而言之,在任何時候使用static應該都是沒有問題的
接口和類方法中的Self
首字母大寫的Self是一個類型,用在protocol中表示實現了這個protocol的類型本身,也包括這個類型的子類
在當前類類的聲明前添加final關鍵字,告訴編譯器我們不再會有子類繼承這個類型。
另一個可以使用Self的地方是在類方法中,使用起來也與此十分相似,核心就在于保證子類也能返回恰當的類型。