Swift类型创建之自定义一个类型详解

   这篇文章主要介绍了Swift类型创建之自定义一个类型详解,本文讲解了自定义原型、实现默认值、支持基本布尔型初始化、支持Bool类型判断、支持兼容各们各派的类型、完善OCBool的布尔基因体系等内容,需要的朋友可以参考下

  小伙伴们,Swift中的Bool类型有着非常重要的语法功能,并支撑起了整个Swift体系中的逻辑判断体系,经过老码的研究和学习, Bool类型本身其实是对基础Boolean类型封装,小伙伴们可能咬着手指头问老码,怎么一会Bool类型,一会Boolean类型,其区别在于,前者是基于枚举的组合类型,而后者则是基本类型,只有两种true和false。

  ####自定义原型

  接下老码根据Bool的思想来创建一个OCBool类型,来让小伙伴们了解一下Swift中到底是怎么玩儿的。

  来我们先看一下OCBool的定义。

  #####代码示例如下:

   代码如下:

  enum OCBool{

  case ocTrue

  case ocFalse

  }

  #####注意:

  代码中第2行和第3行,可以合并到一行写,如苹果官方Blog所写的一样

  代码中命名需要注意:OCBool是类型名,所以首字母必须大写,而case中的ocTrue和ocFalse是小类型则需要首字母小写。

  ####实现默认值

  行,我们给了一个漂亮的定义,不过按照传统语言的经验,Bool值默认情况下是假, 所以我们的OCBool也应该如此,我们使用类型扩展技术增加这个默认特性:

  代码如下:

  extension OCBool{

  init(){

  self =.ocFalse

  }

  }

  #####注意:

  ●代码中第1行:extension关键字,非常强大,小伙伴们可以通过此创造出许多好玩的东西,建议各位去Github上看一个名为“Swiftz”的项目,它将扩展用到了极致。

  ●代码中第3行:self = .ocFalse语法,刚入门的小伙伴们很迷糊,为什么会有奇怪的点语法,因为大牛Chris在Swift中增加了类型智能推断功能,在苹果Blog中,提到了“Context”概念,就是这个意思,因为这行语句是在枚举OCBool中的,其上下文就是OCBool的定义体,编译器当然知道.ocFalse就是OCBool.ocFalse了,所以这里直接点语法,非常整齐。

  现在我们可以使用如下方法使用这个Bool类型。

  #####代码示例如下:

  复制代码 代码如下:

  var result:OCBool = OCBool()

  var result1:OCBool = .ocTrue

  ####支持基本布尔型初始化

  正如上述代码所述,我们只能通过类型或者枚举项目赋值,这是组合类型的用法,但是编码的日子里,我们总是希望和true,false直接打交道,也就是说,我们希望这么做,

  代码示例如下:

   代码如下:

  var isSuccess:OCBool = true

  如果小伙伴们直接这么用,则会出现如下错误:

   代码如下:

  /Users/tyrion-OldCoder/Documents/Learning/BoolType/BoolType/main.swift:30:24: Type 'OCBool' does not conform to protocol 'BooleanLiteralConvertible'

  编译器咆哮的原因是,我们的类型没有遵从“布尔字面量转换协议”,接下来修正这个问题,

  #####代码示例如下:

   代码如下:

  import Foundation

  println("Hello, World!")

  enum OCBool{

  case ocTrue

  case ocFalse

  }

  extension OCBool: BooleanLiteralConvertible{

  static func convertFromBooleanLiteral( value: Bool) ->OCBool{

  return value ? ocTrue : ocFalse

  }

  }

  var isSuccess:OCBool = true

  #####注意:

  代码中的第11行是重点,我的类型OCBool支持了BooleanLiteralConvertible协议,这个协到底是干什么的呢,小伙伴们在Xcode代码编辑器,按住Command键,然后点击第11行中的BooleanLiteralConvertible协议名,则会进入它的定义,

  #####其定义如下:

   代码如下:

  protocol BooleanLiteralConvertible {

  typealias BooleanLiteralType

  class func convertFromBooleanLiteral(value: BooleanLiteralType) -> Self

  }

  这个定义中有个类方法convertFromBooleanLiteral,它的参数为BooleanLiteralType类型,也就是我传入的Bool类型, 且返回值为实现这个协议的类型本身,在我们的OCBool类型中,其返回值就是OCBool本身。经过这个定义,我们可以直接对OCBool类型直接进行布尔字面量初始化了。

  ####支持Bool类型判断

  小伙伴们不安分, 肯定想着我怎么用它实现逻辑判断,所以如果你这么写,

  #####代码示例如下:

   代码如下:

  var isSuccess:OCBool = true

  if isSuccess {

  println( "老码请你吃火锅!")

  }

  你永远吃不到老码的火锅,因为这里编译器会咆哮:

  代码如下:

  /Users/tyrion-OldCoder/Documents/Learning/BoolType/BoolType/main.swift:27:4: Type 'OCBool' does not conform to protocol 'LogicValue'

  OCBool现在只能用bool类型初始化,而不能直接返回bool型,小火把们还记得在《老码说编程之白话Swift江湖》中,老码多次提到,妈妈再也不担心我们 if a = 1{}的写法了, 因为等号不支持值返回了, 所以在if判断是后面的条件必须有返回值,OCBool没有,所以编译器哭了。我们解决这个问题。

  #####代码示例如下:

   代码如下:

  import Foundation

  println("Hello, World!")

  enum OCBool{

  case ocTrue

  case ocFalse

  }

  extension OCBool: BooleanLiteralConvertible{

  static func convertFromBooleanLiteral( value: Bool) ->OCBool{

  return value ? ocTrue : ocFalse

  }

  }

  extension OCBool: LogicValue{

  func getLogicValue() ->Bool {

  var boolValue: Bool{

  switch self{

  case .ocTrue:

  return true

  case .ocFalse:

  return false

  }

  }

  return boolValue

  }

  }

  var isSuccess:OCBool = true

  if isSuccess {

  println( "老码请你吃火锅!")

  }

  ####运行结果如下:

  代码如下:

  Hello, World!

  老码请你吃火锅!

  Program ended with exit code: 0

  #####注意:

  ●如果小伙伴们现在用的是Beta版的Xcode,注意苹果官方Blog中,在代码第17行如果在Xcode Beta4下是错误的,这里的协议是,LogicValue而不是BooleanVue,所以记得看错误提示才是好习惯。

  ●注意代码第34行,完美支持if判断,且输出结果为“老码请你吃火锅”,老码也是说说而已,请不要当真。

  ####支持兼容各们各派的类型

  小伙伴们,江湖风险,门派众多,老码有自己的OCBool类型,可能嵩山少林有自己的SSBool类型,甚至连郭美美都可能有自己的MMBool类型,所以OCBool必须能够识别这些类型,这些各门各派的类型,只要支持LogicValue协议,就应该可以被识别,看老码怎么做,

  #####代码示例如下:

   代码如下:

  extension OCBool{

  init( _ v: LogicValue )

  {

  if v.getLogicValue(){

  self = .ocTrue

  }

  else{

  self = .ocFalse

  }

  }

  }

  var mmResult: Bool = true

  var ocResult:OCBool = OCBool(mmResult)

  if ocResult {

  println( "老码没钱,郭美美请你吃火锅!")

  }

  #####代码运行结果如下:

   代码如下:

  Hello, World!

  老码没钱,郭美美请你吃火锅!

  Program ended with exit code: 0

  漂亮!我们的OCBool类型现在支持了所有的逻辑变量初始化。

  #####注意:

  ●代码中第2行:“_”下横杠的用法,这是一个功能强大的小强,在此的目的是屏蔽外部参数名,所以小伙伴们可以直接:var ocResult:OCBool = OCBool(mmResult)而不是:var ocResult:OCBool = OCBool(v: mmResult),小伙伴们惊呆了!这个init函数中本来就没有外部参数名啊,还记得老码在书里说过没,Swift的初始化函数会默认使用内部参数名,作为外部参数名。

  ####完善OCBool的布尔基因体系:

  小伙伴们,bool类型的价值就是在于各种判断,诸如==,!=, &,|,^,!,以及各种组合逻辑运算,我们OCBool也要具备这些功能,否则就会基因缺陷,且看老码如何实现:

   代码如下:

  extension OCBool: Equatable{

  }

  //支持等值判断运算符

  func ==( left: OCBool, right: OCBool )->Bool{

  switch (left, right){

  case (.ocTrue, .ocTrue):

  return true

  default:

  return false

  }

  }

  //支持位与运算符

  func &( left:OCBool, right: OCBool)->OCBool{

  if left{

  return right

  }

  else{

  return false

  }

  }

  //支持位或运算符

  func |( left:OCBool, right: OCBool)->OCBool{

  if left{

  return true

  }

  else{

  return right

  }

  }

  //支持位异或运算符

  func ^( left:OCBool, right: OCBool)->OCBool{

  return OCBool( left != right )

  }

  //支持求反运算符

  @prefix func !( a:OCBool )-> OCBool{

  return a ^ true

  }

  //支持组合求与运算符

  func &= (inout left:OCBool, right:OCBool ){

  left = left & right

  }

  var isHasMoney:OCBool = true

  var isHasWife:OCBool = true

  var isHasHealty:OCBool = true

  var isHasLover:OCBool = true

  isHasMoney != isHasHealty

  isHasHealty == isHasMoney

  isHasWife ^ isHasLover

  isHasWife = !isHasLover

  if (isHasMoney | isHasHealty) & isHasHealty{

  println( "人生赢家,就像老码一样!")

  }else

  {

  println("人生最苦的事事,人死了钱没花了,人生最苦的事是,人活着,钱没了!")

  }

  好了,到这里就到这里了,窗外的雷声叫醒了老码,现在应该去吃饭了,以上老码给大家展示了如果制造一个自己的类型,记得老码的示例是在Xcode6 Beta4下测试的,至于Beta5的改变还没有涉及,小伙伴们要好生练习,以后各种自定类型都是基于这个思想。还有这个章节不是老码的原创,老码认真的阅读了苹果的官方博客,且自己的练习总结,如果小伙伴们费了吃奶的劲还是看不懂,请找度娘谷歌♂♂♂

时间: 2024-09-23 06:08:59

Swift类型创建之自定义一个类型详解的相关文章

Swift类型创建之自定义一个类型详解_Swift

小伙伴们,Swift中的Bool类型有着非常重要的语法功能,并支撑起了整个Swift体系中的逻辑判断体系,经过老码的研究和学习, Bool类型本身其实是对基础Boolean类型封装,小伙伴们可能咬着手指头问老码,怎么一会Bool类型,一会Boolean类型,其区别在于,前者是基于枚举的组合类型,而后者则是基本类型,只有两种true和false. ####自定义原型 接下老码根据Bool的思想来创建一个OCBool类型,来让小伙伴们了解一下Swift中到底是怎么玩儿的. 来我们先看一下OCBool

[WCF权限控制]WCF自定义授权体系详解[实例篇]

在<原理篇>中,我们谈到WCF自定义授权体系具有两个核心的组件:AuthorizationPolicy和ServiceAuthorizationManager,已经它们是如何写作最终提供一种基于声明的授权实现.为了让自定义授权有深刻的理解,我们来进行一个简单实例来演示如何通过自定义这两个组件实现"非角色授权策略".[源代码从这里下载] 目录: 一.创建演示程序解决方案 二.自定义AuthorizationPolicy 三.自定义ServiceAuthorizationMan

Android使用xml自定义图片实例详解

Android使用xml自定义图片实例详解 实现效果图: 白色圆角图片 bg_round_rectangle_white.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!-

Python中类型关系和继承关系实例详解

  本文详细介绍了Python中类型关系和继承关系.分享给大家供大家参考.具体分析如下: 如果一个对象A持有另一个对象B的ID,那么检索到A之后就可以检索到B,我们就说存在一个A到B的导航.这种导航关系使得Python中所有对象之间形成了一个复杂的网络结构. Python程序的运行包括: 1. 修改这个网络结构; 2. 执行有副作用的代码对象(code object或者说bytecode,见Python Language Reference 3.2) (副作用是指影响Python虚拟机之外的设备

PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)_php技巧

本文实例讲述了PHP自定义函数用法.分享给大家供大家参考,具体如下: Demo1.php <?php //标准函数,内置函数 echo md5('123456'); echo '<br/>'; echo sha1('123456'); echo '阅谁问君诵,水落清香浮.'; ?> Demo2.php <?php //创建函数,不要跟系统的内置函数重名 //函数有个特性,必须调用,才可以执行 //无参数表示()里面是空的,无返回就是函数的程序里没有 return functi

Android开发笔记之:用Enum(枚举类型)取代整数集的应用详解_Android

在Android的API中可以发现有很多用整数集来作为参数的地方,先来看一下实例.LinearLayout是大家所熟知的一个UI基本元素,它里面有一个方向的属性,可以通过以下方法来设置: 复制代码 代码如下: LinearLayout.setOrientation(int); 使用的时候,通常都是这样: 复制代码 代码如下: LinearLayout.setOrientation(LinearLayout.HORIZONTAL);LinearLayout.setOrientation(Linea

Android开发笔记之:用Enum(枚举类型)取代整数集的应用详解

在Android的API中可以发现有很多用整数集来作为参数的地方,先来看一下实例. LinearLayout是大家所熟知的一个UI基本元素,它里面有一个方向的属性,可以通过以下方法来设置: 复制代码 代码如下: LinearLayout.setOrientation(int); 使用的时候,通常都是这样: 复制代码 代码如下: LinearLayout.setOrientation(LinearLayout.HORIZONTAL); LinearLayout.setOrientation(Lin

Swift语言中的一些访问控制设置详解_Swift

限制访问代码块,模块和抽象通过访问控制来完成.类,结构和枚举可以根据自己的属性,方法,初始化函数和下标来通过访问控制机制进行访问.常量,变量和函数的协议限制,并允许通过访问控制来访问全局和局部变量.应用于属性,类型及函数的访问控制可以被称为"实体". 访问控制模型是基于模块和源文件的. 模块定义为代码分配一个单独的单元,并且可以使用import 关键字导入.源文件被定义为一个单一的源代码文件,模块可访问多种类型和函数. 三种不同的访问级别是由 Swift 语言提供.它们分别是 Publ

[WCF权限控制]WCF自定义授权体系详解[原理篇]

到目前为止,我么介绍的授权策略都是围绕着安全主体进行的,基本上都是基于角色的授权.虽然角色是定义权限最为常用的形式,但是它解决不了授权的所有问题.基于角色的授权策略一般是这样的:需要进行访问控制的操作或者资源关联到某个角色上,那么只要访问者被分配了该角色,就被授予了相应的权限.那么假设我们的授权策略是这样的:访问权限和两个角色进行关联,访问者需要同时被分配了这两个角色才能被授权.这是一个很常见的授权策略,但是典型的基于单一角色的授权解决不了这个问题(除非为两个角色的交集创建新的角色).而这仅仅是