标签分类 热门分类
当前位置:首页 > 程序设计电子书 > Swift电子书网盘下载
Swift编程权威指南 Swift编程权威指南
Twons

Twons 提供上传

资源
34
粉丝
22
喜欢
163
评论
4

    Swift编程权威指南 PDF 高清第2版

    Swift电子书
    • 发布时间:

    给大家带来的一篇关于Swift相关的电子书资源,介绍了关于Swift、编程、指南方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小28.3 MB,马修·马赛厄斯编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:7.7,更多相关的学习资源可以参阅 程序设计电子书、等栏目。

  • Swift编程权威指南 PDF 下载
  • 下载地址:https://pan.baidu.com/s/125cAlfTCsYLjDMILL9qxc
  • 分享码:kdb4
  • Swift编程权威指南

    内容介绍

    Big Nerd Ranch是英国一间技术专业的移动开发专业技术培训组织,这书是其培训教材。Swift编程权威指南(第2版)系统软件解读了在苹果ios和macOS服务平台上,应用iPhone的Swift語言开发设计苹果手机、pad和mac电脑运用的基本要素和编程方法。关键紧紧围绕应用Swift語言开展苹果ios和macOS开发设计,融合很多编码实例,教會小读者运用高級苹果ios和macOS特点开发设计真實的运用。

    适读群体 :这书小读者另一半为苹果ios和macOS服务平台中移动开发者。

    目录

    • 第一部分 起步
    • 第1章 起步  2
    • 第2章 类型、常量和变量  8
    • 第二部分 基础知识
    • 第3章 条件语句  14
    • 第4章 数  20
    • 第5章 switch语句  29
    • 第6章 循环  41
    • 第7章 字符串  51
    • 第8章 可空类型  58
    • 第三部分 容器和函数
    • 第9章 数组  68
    • 第10章 字典  79
    • 第11章 集合  87
    • 第12章 函数  93
    • 第13章 闭包  106
    • 第四部分 枚举、结构体和类
    • 第14章 枚举  122
    • 第15章 结构体和类  137
    • 第16章 属性  158
    • 第17章 初始化  172
    • 第18章 值类型与引用类型  190
    • 第五部分 Swift高级编程
    • 第19章 协议  210
    • 第20章 错误处理  222
    • 第21章 扩展  242
    • 第22章 泛型  249
    • 第23章 协议扩展  262
    • 第24章 内存管理和ARC  271
    • 第25章 Equatable和Comparable  284
    • 第六部分 事件驱动的应用
    • 第26章 第一个Cocoa应用  296
    • 第27章 第一个iOS应用  321
    • 第28章 互操作  342
    • 第29章 结语  369

    读书笔记

    深入理解Swift中的Substring和String

    前言

    为文本字符串添加特性或者语法糖在各种编程语言中都很普遍。就拿大家都很熟悉的 C 语言举例,C 字符串本质是一个字符数组(characters array),但是每次输入字符串的时候不用输入 ['h','e','l','l','o'] ,直接打 hello 就可以了,因为这个操作编译器帮你做了。

    更高级的语言比如 Swift 处理字符串就不仅仅是当做字符数组了,String 是一个完整的类型,并且有各种特性。我们先来看一下 String 的一个特性:substring。

    简单的看一下 String

    首先粗略的了解一下字符串的实现。下面的代码来自标准库中 String.swift :

    public struct String {
     public var _core: _StringCore
    }

    当然也有一些其他初始化设置,不过在声明里只有这一个存储属性!秘密一定都在 StringCore.swift 里:

    public struct _StringCore {
     public var _baseAddress: UnsafeMutableRawPointer?
     var _countAndFlags: UInt
     public var _owner: AnyObject?
    }

    在这个类型里还有很多其他东西,不过我们还是只关注存储属性:

    • Base address — 一个指向内部存储的指针
    • Count — 字符串长度,UInt 类型,在一个 64 位的系统中,意味着有 62(64 - 2) 位的空间可以表示长度。这是一个非常大的数字。所以字符串的长度不太可能溢出。
    • Flags — 两个 bits 用来做标志。第一位表示是否被 _StringBuffer 持有;第二位表示编码格式是 ASCII 还是 UTF-16。

    _StringCore 的真实情况比这里提到的要复杂的多,但是通过上面的内容可以让我们更容易理解字符串的一些信息:字符串的内部存储和存储的大小(underlying storage and size)。

    Substring

    Swift 中要怎么创建一个 substring?最简单的方式就是通过下标从 string 取一段:

    let str = "Hello Swift!"
    let slice = str[str.startIndex..
    <str index="" str="" startindex="" nbsp="" offsetby:="" 5="" hello=""></str>

    虽然很简单,但是代码看起来不太优雅。

    String 的索引不是直观的整型,所以截取时的位置索引需要利用 startIndex 和 index(_:offsetBy:)获取。如果是从字符串开始位置截取,可以省略掉 startIndex :

    let withPartialRange = str[..
    <str index="" str="" startindex="" nbsp="" offsetby:="" 5="" still="" hello=""></str>

    或者用 collection 中的这个方法:

    let slice = str.prefix(5)
    // still "Hello"

    要记住字符串也是 collection ,所以你可以用集合下的方法,比如 prefix(),suffix(), dropFirst() 等。

    Substring 的内部原理

    substring 一个神奇的地方是他们重用了父 string 的内存。你可以把 substring 理解为父 string 的其中一段。

    深入理解Swift中的Substring和String

    举个例子,如果从一个 8000 个字符的字符串中截取 100 个字符,并不需要重新初始化 100 个字符的内存空间。

    这也意味着你可能不小心就把父 string 的生命周期延长了。如果有一大段字符串,然后你只是截取了一小段,只要截取的小段字符串没有释放,大段的字符串也不会被释放。

    Substring 内部到底是怎么做到的呢?

    public struct Substring {
     internal var _slice: RangeReplaceableBidirectionalSlice
    <string></string>

    内部的 _slice 属性保存着所有关于父字符串的信息:

    // Still inside Substring
    internal var _wholeString: String {
     return _slice._base
    }
    public var startIndex: Index { return _slice.startIndex }
    public var endIndex: Index { return _slice.endIndex }

    计算属性 _wholeString(返回整个父字符串),startIndex 和 endIndex 都是通过内部的 _slice 返回。

    也可以看出 slice 是如何引用父字符串的。

    Substring 转换为 String

    最后代码里可能有很多 substring,但是函数的参数类型需要的是 string。Substring 转换到 string 的过程也很简单:

    let string = String(substring)

    因为 substrings 和它的父字符串共享同一个内存空间,猜测创建一个新字符串应该会初始化一片新的存储空间。那么 string 的初始化到底过程是怎样的呢。

    extension String {
     public init(_ substring: Substring) {
     // 1
     let x = substring._wholeString
     // 2
     let start = substring.startIndex
     let end = substring.endIndex
     // 3
     let u16 = x._core[start.encodedOffset..
    <end encodedoffset="" nbsp="" 4a="" if="" start="" sameposition="" in:="" x="" unicodescalars="" end="" self="" 4b="" else=""></end>
    • 创建一个对原有父字符串的引用
    • 获取 substring 在父字符串中的开始和结束位置
    • 获取 UTF-16 格式的 substring 内容。_core 是 _StringCore 的一个实例。
    • 判断匹配的 unicode 编码,生成一个新的字符串实例

    把 substring 转换成 string 的步骤非常简单,但是你可能要考虑是不是一需要这样做。是不是进行 substring 操作的时候都要求类型是 string?如果对 substring 的操作都需要转成 string,那么轻量级的 substring 也就失去了意义。

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对码农之家的支持。

    上一篇:iOS编程基础:Swift、Xcode和Cocoa入门指南  下一篇:深度学习:从入门到实战

    展开 +

    收起 -

     
    Swift 相关电子书
    关于Swift的学习笔记
    网友NO.718022

    Java并发编程Callable与Future的应用实例代码

    本文主要探究的是java并发编程callable与future的使用,分享了相关实例代码,具体介绍如下。 我们都知道实现多线程有2种方式,一种是继承Thread,一种是实现Runnable,但这2种方式都有一个缺陷,在任务完成后无法获取返回结果。要想获得返回结果,就得使用Callable,Callable任务可以有返回值,但是没法直接从Callable任务里获取返回值;想要获取Callabel任务的返回值,需要用到Future。所以Callable任务和Future模式,通常结合起来使用。 试想一个场景:需要一个帖子列表接口,除了需要返回帖子列表之外,还需要返回每条帖子的点赞列表和评论列表。一页10条帖子来计算,这个接口需要访问21次数据库,访问一次数据库按100ms计算,21次,累计时间为2.1s。这个响应时间,怕是无法令人满意的。怎么办呢?异步化改造接口。 查出帖子列表后,迭代帖子列表,在循环里起10个线程,并发去获取每条帖子的点赞列表,同时另起10个线程,并发去获取每条帖子的评论列表。这样改造之后,接口的响应时间大大缩短,在200ms。这个时候就要用Callabel结合Future来实现。 private ListPostResponse createPostResponseList(PagePostResponse page,final String userId){ if(page.getCount()==0||page==null||page.getList()==null){ return null; } //获取帖子列表 ListPostResponse circleResponseList = page.getList()……

    网友NO.728671

    Java编程一道多线程问题实例代码

    前面几篇博文基本上总结了一下java并发里的一些内容,这篇博文主要从一个问题入手,看看都能用到前面总结的哪些并发技术去解决。 题目描述: 模拟一个场景:处理16条日志记录,每条日志记录打印时间需要1秒,正常情况下如果将这16条记录去部打完需要16秒,现在为了提高效率,准备开启4个线程去打印,4秒钟打印完,实现这个demo。 先来分析一下这个题目,关于这16条日志记录,我们可以在主线程中产生出来,这没用什么难度,关键是开启4个线程去执行,现在有两种思路:一种是日志的产生和打印日志的线程在逻辑上分开;一种是日志的产生和打印日志的线程在逻辑上不是分开的。这样说可能有点晦涩,下面我针对这两种思路,写个实现的demo就好理解了。 思路一 日志产生和日志打印在逻辑上是分开的。 这相当于两条战线: 一条战线在不停的产生日志,另一个战线在不停的打印日志。很明显会想到阻塞队列的使用,产生日志不停的往阻塞队列中塞,打印日志不停的从阻塞队列中取,阻塞队列的大小可以自己设置,可以设置16个,也可以设置为1个,这都不影响执行。所以会用到BlockingQueue,下面看一下实现的demo: public class Practice1 {public static void main(String[] args) {//定义一个阻塞队列,队列大小可以装16个信息BlockingQ……

    网友NO.687036

    java编程进行动态编译加载代码分享

    简述 该类使用javax.tools.ToolProvider自带的JavaCompiler进行编译,使用IO的File及NIO的Files进行对应的路径创建、读取及拷贝,使用正则表达式进行包名与目录的转换,我只是将这些东西做了个容错整合,没什么技术含量,就为个方便吧。 模块API class DynamicReactor://空参构造 public Class? dynamicCompile(String srcPath);//输入一个指定的源文件路径,若编译、拷贝成功则返回该类对应的Class类实例 private String changePacketToDic(String packageName);//将一个合法的包名转换为对应JavaClassPath中的路径(我是用的是eclipse 所以需要对应地增加bin这一目录,若使用其他不同编译器,请参考对应的运行上下文设置进行适当修改) private String getPackage(String srcPath);//由一个合法的java文件路径尝试获得其包名 源代码 import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths;import java.nio.file.StandardCopyOption;import java.util.regex.Matcher;import java.util.regex.Pattern;import javax.tools.JavaCompiler;import javax.tools.ToolProvider;/** * DynamicReactor 一个动态编译模块,负责编译源文件,复制到对应包下及加载类等过程(JDK 1.7) * @author 三向板砖 * */public class DynamicReactor {JavaCompiler compiler;Pattern packagePattern;static final String regEx = "(?=p……

    Copyright 2018-2020 xz577.com 码农之家

    电子书资源由网友、会员提供上传,本站记录提供者的基本信息及资源来路

    鸣谢: “ 码小辫 ” 公众号提供回调API服务、“ 脚本CDN ”提供网站加速(本站寻求更多赞助支持)

    版权投诉 / 书籍推广 / 赞助:520161757@qq.com

    上传资源(网友、会员均可提供)

    查看最新会员资料及资源信息