1、枚举 如果枚举为Int类型 ,那么该枚举就会有rawValue
enum Rank :Int{
case Ace = 1
case Two ,Three,Four,Five,Six,Seven,Eight,Nine,Ten
case jack ,Queen,King
func simpleDescripation()->NSString{
switch self{
case .Ace :
return "Ace"
case .jack :
return "jack"
default:
return "\(self.rawValue)"
}
}
将枚举值作为函数的参数。判断当前的枚举值.rawValue大还是传进来的参数的枚举值的.rawValue 大
func moreThan(r1 :Rank)->Bool{
return self.rawValue > r1.rawValue
}
func sayHi(){
print("welcome to Rank")
}
}
let king = Rank.King
print(king.simpleDescripation())
print(Rank.Ten.moreThan(Rank.jack))
king.sayHi()
调用枚举的init方法,通过rawValue去找到对应的枚举 threeValue = Rank.Three
let threeValue = Rank(rawValue: 1)
print(threeValue!.simpleDescripation())
不带类型的枚举
enum 棋
{
case 象棋,围棋,五子棋,国际象棋
func simpleDescripation()->NSString{
switch self{
case .象棋 :
return "象棋"
case .围棋 :
return "围棋"
case .五子棋:
return "五子棋"
case .国际象棋:
return "国际象棋"
default :
return "其他\(self.hashValue)"
}
}
//方法名字 :当前流行 ,返回值String。 如果是象棋、围棋,返回当前流行;如果是五子棋,返回流行;如果是国际象棋,返回国际流行。
func popularDate()->String{
switch self{
case .象棋,.围棋 :
return "当前流行"
case .五子棋 :
return "流行"
default :
return "国际流行"
}
}
//如果枚举没有Int类型的话,就没有rawValue 这个属性。 在swich语句中也可以不要defult语句.
}
var 棋对象 = 棋.国际象棋
print(棋对象.simpleDescripation())
print(棋对象.popularDate())
print(棋对象.hashValue)
元组作为枚举值的情况。
enum example{
case one(name :String,age:Int),two(name :String ,age:Int )
func simpleDescripation ()->String{
switch self{
case .one(name: "zhangsan", age: 24):
return"one is name \(name) , age \(age) "
case .two(name: "lisi", age: 22):
return"two is name\(two),age \(age)"
default :
return "error"
}
}
}
var 例子 = example.one(name: "zhangsan", age: 24)
print(例子.simpleDescripation())
2、结构体
struct 棋艺 {
// 和类一样,里面可以放变量,常量和方法。
var chess:棋
var chessArt :等级
let sss = 222
func simpleDescripation()->String{
return "这个人会 \(chess.simpleDescripation()) 是 \(chessArt.simpleDescripation()) 水平"
}
}// 结构体会自动给我们生成init方法。
let 王五 = 棋艺(chess: 棋.象棋, chessArt: 等级.初级棋手)
print(王五.simpleDescripation())
print(王五.chess)
3、协议
protocol ExampleProtocol{
// 可以写变量。 方法
// 协议中的变量必须要有get方法, 可以没有实现部分,
// 协议 和OC中的require协议是一样的都是必须要遵从的。
var simpleDescripation:String{
get
}
mutating func adjust()
}
4、swift 类 结构体, 枚举 都可以遵从协议
类遵从协议
class SimpleClass:ExampleProtocol{
var simpleDescripation = "a very SimpleClass "
func adjust() {
simpleDescripation += "a adjust 100%"
}
}
var simple = SimpleClass()
print(simple.simpleDescripation)
print(simple.adjust())
结构体遵从协议
struct SimpleStruct:ExampleProtocol {
var simpleDescripation = "a very SimpleStruct "
// mutating 用在结构体中如果想要改变协议中的变量的值时,机构体默认是不允许去改变结构体中的变量的。包括协议的方法声明前也要加这个关键字
mutating func adjust() {
simpleDescripation += "a adjust 100%"
}
}
var structExample = SimpleStruct(simpleDescripation: "djkda")
print(structExample.simpleDescripation)
print(structExample.adjust())
枚举继承协议,枚举如果没有类型不能直接给变量赋值。
enum SimpleEnum:ExampleProtocol{
//我们只能重写他的set方法去解决不能赋值的问题
case one ,two ,three
var simpleDescripation:String{
get{
switch self
{
case .one:
return "one"
case .two:
return "two"
default:
return "three"
}
}
}
// 在改变成员变量值的时候才要用到 mutating
func adjust() {
print( simpleDescripation)
}
}
5、延展, 给一个已有类写新的方法。也可以继承协议
extension Int:ExampleProtocol{
var simpleDescripation :String{
return "a extension Protocol"
}
func adjust() {
print("very good")
}
}
var ss1 = 13
print(ss1.simpleDescripation)
print(ss1.adjust())