swift的枚举、结构体、协议和延展

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())
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值