Swift数字类型之间的转换Swift是一种安全的语言,对于类型的检查非常严格,不同类型之间不能随便转换。
一、整型之间的转换
在C和Objective-C等其他语言中,整型之间有两种转换方法:
从小范围数到大范围数转换是自动的;
从大范围数到小范围数需要强制类型转换,有可能造成数据精度的丢失。
而在Swift中这两种方法是行不通的,我们需要通过一些函数进行显式地转换,代码如下:

  1. let historyScore:UInt8 = 90
  2. let englishScore:UInt16 = 130
  3. let totalScore = historyScore + englishScore  //错误  ①
  4. let totalScore = UInt16(historyScore) + englishScore   //正确 ②
  5. let totalScore = historyScore + UInt8(englishScore)  //正确   ③

上述代码声明和初始化了两个常量historyScore和englishScore,我们把它们相加赋值给totalScore。如果采用第①行代码实现相加,程序就会有编译错误,原因是historyScore是UInt8类型,而englishScore是UInt16类型,它们之间不能转换。
我们有两种转换方法。
一种是把UInt8的historyScore转换为UInt16类型。由于是从小范围数转换为大范围数,这种转换是安全的。代码第②行UInt16(historyScore)就是正确的转换方法。
另外一种是把UInt16的englishScore转换为UInt8类型。由于是从大范围数转换为小范围数,这种转换是不安全的,如果转换的数比较大会造成精度的丢失。代码第③行UInt8(englishScore)是正确的转换方法。由于本例中englishScore的值是130,这个转换是成功的,如果把这个数修改为1300,虽然程序编译没有问题,但是会在控制台中输出异常信息,这是运行期异常。
上述代码中,UInt16(historyScore)和UInt8(englishScore)事实上是构造器,能够创建并初始化另外一个类型。关于构造器的内容,我们会在第14章详细介绍。
二、整型与浮点型之间的转换
整型与浮点型之间的转换与整型之间的转换类似,因此我们将上一节的示例修改如下:

  1. let historyScore:Float = 90.6           ①
  2. let englishScore:UInt16 = 130           ②
  3. let totalScore = historyScore + englishScore  //错误          ③
  4. let totalScore = historyScore + Float(englishScore)  //正确,安全    ④
  5. let totalScore = UInt16(historyScore) + englishScore  //正确,小数被截掉    ⑤

上述代码经过了一些修改,第①行代码historyScore变量类型是Float类型。第②行代码englishScore变量还是UInt16类型。其中第③行代码直接进行了计算,结果有编译错误。第④行代码是将UInt16类型的englishScore变量转换为Float类型,这种转换是最安全的。第⑤行代码是将Float类型的historyScore变量转换为UInt16类型,这种转换首先会导致小数被截掉,另外如果historyScore变量数很大,会导致运行期异常,这与整型之间的转换是类似的。

更多内容请关注国内第一本Swift图书《Swift开发指南》
本书交流讨论网站:http://www.51work6.com/swift.php
欢迎加入Swift技术讨论群:362298485

欢迎关注智捷iOS课堂微信公共平台

Swift数字类型之间的转换的更多相关文章

  1. 《从零开始学Swift》学习笔记(Day 15)——请注意数字类型之间的转换

    原创文章,欢迎转载.转载请注明:关东升的博客 在C.Objective-C和Java等其他语言中,整型之间有两种转换方法: 从小范围数到大范围数转换是自动的: 从大范围数到小范围数需要强制类型转换,有 ...

  2. DB2中字符、数字和日期类型之间的转换

    DB2中字符.数字和日期类型之间的转换 一般我们在使用DB2或Oracle的过程中,经常会在数字<->字符<->日期三种类 型之间做转换,那么在DB2和Oracle中,他们分别 ...

  3. NSString / NSData / char* 类型之间的转换

    转自网络: NSString / NSData / char* 类型之间的转换 1. NSString转化为UNICODE String: (NSString*)fname = @“Test”; ch ...

  4. C++四种类型之间的转换

    C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a. C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. const_cas ...

  5. 【opencv基础】opencv和dlib库中rectangle类型之间的转换

    前言 最近使用dlib库的同时也会用到opencv,特别是由于对dlib库的画图函数不熟悉,都想着转换到opencv进行show.本文介绍一下两种开源库中rectangle类型之间的转换. 类型说明 ...

  6. pytorch--基础类型之间的转换

    在pytorch自己定义张量并进行计算的时候,往往会因为类型不匹配而报错,这里稍微记下pytorch之间的类型转换: 对tensor基础类型进行转换:比如说int().float().long().d ...

  7. NSString、NSData、char* 类型之间的转换-备

    1. NSString转化为UNICODE String: (NSString*)fname = @“Test”; char fnameStr[10]; memcpy(fnameStr, [fname ...

  8. 什么 是JavaScript中的字符串类型之间的转换问题详解? 部分4

    字符串类型 单双引号都可以!建议使用单引号!(本人建议:个人觉得单个字符串更利于网页优化@特别地方特别处理!); 判断字符串的长度获取方式:变量名.length html中转义符: < < ...

  9. 流程控制 if while for 已及数字类型 进制转换

    一:if 语句 语法一:ifif 条件: code1 code1 code1 语法二:if ...else ... if 条件: code1 code1 code1else: code1 code1 ...

随机推荐

  1. Struts 2.x异常:Unable to load configuration..../WEB-INF/lib/struts2-convention-plugin-2.1.6.jar!/struts-plugin.xml:30:119

    Struts 2.x异常:Unable to load configuration..../WEB-INF/lib/struts2-convention-plugin-2.1.6.jar!/strut ...

  2. [ALGO-3] K好数

    算法训练 K好数   时间限制:1.0s   内存限制:256.0MB 问题描写叙述 假设一个自然数N的K进制表示中随意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数 ...

  3. 为什么监听不到开机广播action.BOOT_COMPLETED

    为什么监听不到开机广播action.BOOT_COMPLETED 1. 说明 Android手机开机后,会发送android.intent.action.BOOT_COMPLETED广播,监听这个广播 ...

  4. 小菜学习MVC4-WebApi

    今天想看下MVC4的东西,发现 居然有WebApi这东西,百度了一下..居然是 WCF中的东西,然后移植到了MVC4中,WCF你懂得返回数据都是xml,向网站这种请求 就比较纠结...而webapi可 ...

  5. Codeforces Bubble Cup 8 - Finals [Online Mirror] D. Tablecity 数学题

    D. Tablecity Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/575/problem/D ...

  6. delphi CoolBar这个怎么弄没了

    CoolBar这个怎么弄没了 像Windows这样的     procedure TForm1.Button1Click(Sender: TObject); begin    CoolBar1.Fix ...

  7. android 用ListView实现表格样式

    原文:http://blog.csdn.net/centralperk/article/details/8016350 效果图: 源码下载地址:http://download.csdn.net/det ...

  8. ural 1993 This cheeseburger you don't need

    顺次存到{} [] () 遇到逗号就处理下,最后处理逗号之后的 #include <iostream> #include <cstring> #include <stri ...

  9. Fliptile

      开关题   尺度法  Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3394   Accepted:  ...

  10. 把旧的项目改变名称重新部署到tomcat下发现项目名称还是原来的项目名称,解决方案

    选中项目右键点击properties 在type file text 中输入web 选择web在右边可以看到web-context-root 把里面的项目名称改成你最新的就ok了