swift学习笔记6

字符和字符串
在swift中,String类型也是结构体,属于值类型,而不是引用类型。这一点,与OC是不一样的。

//
//  main.swift
//  swift06
//
//  Created by iOS on 2018/9/25.
//  Copyright © 2018年 weiman. All rights reserved.
//import Foundation// 概述
do {let a = "a"print(a)let b = "hello"print(b)let c = "你好呀"print(c)let d = """今天天气很好,我出去逛逛。it is a good day today, I'm going to have a walk.今日は天気がよいので,私は出かけて出かけます."""print(d)
}//注意,swift中引入了多行字符串字面量的表达形式,通过 """三个双引号包围起来,可以输入换行符。// 输出不想有换行符,但是文字较长,在书写的时候有换行符,这个时候我们可以在换行符前面加上 \,例如:
do {let a = """白日依山尽,\黄河入海流。\欲穷千里目,\更上一层楼"""print(a)/*输出:  白日依山尽, 黄河入海流。 欲穷千里目, 更上一层楼*/
}

// 字符
/*
在swift编程语言中,对字符的表示是独立于某一种特定的Unicode编码的。
整个Unicode标准编码由三个平面构成:
1.基本多语言平面:大部分拉丁字母、希腊字母、标点符号、亚洲的部分字母;
2.补充平面:包含了某些不在基本多语言平面的非拉丁字符、亚洲文字等,所有Emoji表情;
3.保留平面:永久保留的码点部分。
*/

do {// 创建一个字符对象 ‘0’// 注意,使用UnicodeScalar构造出来的对象是可选的。let zero = UnicodeScalar("0")if let z = zero {print("z = \(z)")print("scalar value = \(z.value)")}// 使用类型标注的方式声明并初始化alet a: UnicodeScalar = "a"print("a = \(a)")print("scalar value = \(a.value)")let pai = UnicodeScalar("π")if let p = pai {print("pai = \(p)")print("scalar value = \(p.value)")}let 好: UnicodeScalar = "好"print("好 = \(好)")
}/*UnicodeScalar可以表示字符,那么为什么还需要Character呢?因为现在充斥着各种丰富的Emoji表情,光20位的码点已经无法满足需求了,需要Emoji已经用两个码点进行表示了,比如各国的国旗。所以,swift中使用Character类型以覆盖所有的可被编码的字符。也就是说,一个Characteru对象可包含多个UnicodeScalar对象。*///let flag: UnicodeScalar = "??"
//报错 Cannot convert value of type 'String' to specified type 'UnicodeScalar' (aka 'Unicode.Scalar')
let flag: Character = "??"
print("flag: \(flag)")// 通过码点来构造UnicodeScalar类型的对象。let c = UnicodeScalar(127464)!
let n = UnicodeScalar(127475)!
print("c = \(c), n = \(n)")//我们将两个UnicodeScalar对子昂的字符对象拼在一起,构成一个String对象,然后用Character
//构造方法将这个String对象中的内容转换为Character相应的值。
let cn = Character(String([Character(c),Character(n)]))
print("cn = \(cn)")// 2. 转义字符
print("\n")
print("---------转义字符-------------")
/*什么是转义字符?转义字符用来表示这些无法在源代码中表示的特殊字符。如何表示?swift中使用反斜杠作为转义字符的引导前缀。*/do {let s = "Say, \"Hello\",很好!"print(s)let a = "??".unicodeScalars.first?.valuelet b = "??".unicodeScalars.last?.valueprint("a = \(a), b = \(b)")
}//3. 字符串(String)
do {// 空字符串let a = ""print(a)let b = String()print(b)let c = "hello"print(c)let d = "你好"print(d)// 常用属性//1. 拼接字符串let e = c + dprint("e = \(e)")//2. +=拼接var f = "aaa"f += "bbb"print("f = \(f)")//3. == 比较if a == b {print("字符串相等")} else {print("不相等")}//4. 判断是否为空字符串if a.isEmpty {print("a是空字符串")} else {print("非空字符串")}//5. 包含子串if f.contains("a") {print("包含子串")} else {print("不包含子串")}//6.是否以某字符串开头if f.hasPrefix("a") {print("以a开头")} else {print("不是以a开头")}//7. 是否以某字符串结尾if f.hasSuffix(".mp4") {print("结尾包含.mp4")} else {print("结尾不包含.mp4")}
}

// 4. 字符串插值
/*
什么是字符串插值?
swift语言提供了一种十分便利的方式可以将几乎任一类型的对象转换为一个字符串的表示形式,
这就叫做字符串插值。
其实,我们在之前的打印中已经多次用到了字符串插值,只是没有提出这一概念。
语法:(Obj)
*/

do {let x = 10, y = 20let s = "x + y = \(x + y)"print("s is \(s)")// 或print("s is:" + s)// 自定义类型struct MyType {var x = 10, y = 20}let str = "my type: \(MyType())"print("自定义类型: \(str)")// 自定义类型定制字符串表达描述struct MyStruct: CustomStringConvertible {var a = 10var b = 20var description: String {return String("MyStruct: a = \(a), b = \(b)")}}var obj = MyStruct()obj.a = -obj.aobj.b *= 2print("哈哈哈,自定义: \(obj)")
}

// 5.字符串的characters属性
/*
如果我们想要迭代访问一个字符串的每个字符,或者是查询当前字符串中包含了多少字符个数,那么我们可以访问
String对象的characters属性。
注意:characters属性是swift3.2以下的属性,之后就不建议使用了。
我们在这里简单了解以下。

@available(swift, deprecated: 3.2, message: "Please use String or Substring directly")
public var characters: String.CharacterView

*/

do {var str = "看看旗帜1:\u{1f1e8}"print("count: \(str.count)")print("before appending :", separator: "",terminator: "")// 输出字符序列for ch in str.characters {print("\(ch)", separator: "", terminator: " ")}print("\n")//新增一个字符str.append("\u{1f1f3}")//输出当前字符串中字符个数print("count: \(str.count)")for ch in str {print("\(ch)", separator: "", terminator: " ")}let str2 = "看看旗帜2:\u{1f1e8}\u{1f1f3}"print("count: \(str2.count)")print(str2)// 字符串的最后和第一个字符属性print("第一个字符: \(str2.first ?? " " )")print("最后一个字符: \(str2.last ?? " " )")// 注意:first和last属性都是返回的可选类型
}

// 6. 字符串的索引以及字符访问
/*
注意:我们不能通过下标索引的方式访问字符串中的指定位置的字符,那么我们该如何访问单独的字符呢?
swift编程语言为string类型引入了索引类型String.Index用于表示字符串对象中字符序列的索引值。
由于String.Index类型遵循了Comparable协议,所以它可以作为范围操作符的操作数。

swift中String.Index的声明如下:

/// A position of a character or code unit in a string.
public struct Index {
}
*/

do {// 常用属性//1.开始位置,结束位置var str = "00000000000000000000"let start = str.startIndexlet end = str.endIndex//2.获得指定的索引值// index( _ , offsetBy: _)// 第一个参数:开始位置// 第二个参数:偏移量,为正数:返回的索引值往后挪n位,为负数:往前挪n位。let index = str.index(start, offsetBy: 5)str.insert("1", at: index)print("newstr: \(str)")// newstr: 000001000000000000000/*index(_, offsetBy: _, limitedBy: _)作用与 index( _ , offsetBy: _) 一样。第一个参数:开始位置第二个参数:偏移量第三个参数:边界检测,如果索引计算的结果超过了边界,此方法就会返回空,因此返回值是一个可选值。*/if let index2 = str.index(end, offsetBy: -5, limitedBy: start) {str.insert("2", at: index2)print("str2: \(str)")//str2: 0000010000000002000000}//3.Substring类型/*public struct Substring : StringProtocol {....}Substring类型的对象是一个优化过的子串对象模型,它不仅具有String几乎全部的属性和方法,而且它共享了其原始字符串的存储空间,使得对它的操作非常快捷。*/let myString = "好好学习,天天向上,每天都是好天气。??"let startIndex = myString.startIndexlet endIndex = myString.endIndexlet index3 = myString.index(startIndex, offsetBy: 3)let index10 = myString.index(startIndex, offsetBy: 10, limitedBy: endIndex)if let temp = index10 {let subStr = myString[index3 ..< temp]var ch = subStr.firstprint("first = \(ch ?? " " )")ch = subStr.lastprint("last: \(ch ?? " " )")}/*注意:endIndex属性指定的是字符串中最后一个字符的后一个索引位置,所以该属性的前一个位置才是此字符串中的最后一个字符的位置,这一点一定要注意。*/}

swift4.1 系统学习六相关推荐

  1. swift4.1 系统学习十 函数

    swift的函数与其他语言中的函数还是有很多的不同点的, 我们在本节中一起学习swift中的函数都有哪些特性. 辅助文件, 在"统一的函数引用体系"中会用到. // // test ...

  2. 系统学习 Java IO (六)----管道流 PipedInputStream/PipedOutputStream

    目录:系统学习 Java IO---- 目录,概览 PipedInputStream 类使得可以作为字节流读取管道的内容. 管道是同一 JVM 内的线程之间的通信通道. 使用两个已连接的管道流时,要为 ...

  3. 【六更完结!由于字数限制开新文章继续】零基础信号与系统学习笔记:复指数信号、傅里叶级数的系数推导、三角函数正交性、离散傅里叶变换、相位补偿、z变换表、逆变换表、常见序列及其作用

    零基础信号与系统学习笔记:复指数信号.傅里叶变换.三角函数正交性 基础1:复指数信号 复指数信号基础知识 复指数信号推导1 虚指数信号 虚指数信号特性和作用 直流信号 基础2:傅里叶级数 推导傅里叶级 ...

  4. python自学流程-Python系统学习流程图,教你一步步学习python

    对于刚开始接触Python的小伙伴来说,没有思路方法,不知道从何开始学习,把软件环境安装好后就不知所措了!接下来我给大家分享下多位大牛倾力打造的python系统学习流程,一个月才设计完的! Pytho ...

  5. [系统安全] 六.逆向分析之条件语句和循环语句源码还原及流程控制

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  6. 系统学习Linux11点建议

    随着Linux应用的扩展许多朋友开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起.这里介绍学习Linux的一些建议. 一.从基础开始 常常有些朋友在Linux论 ...

  7. 用python设计一个管理系统思路_Python大佬一个月打造的Python系统学习流程图!

    对于刚开始接触Python的小伙伴来说,没有思路方法,不知道从何开始学习,把软件环境安装好后就不知所措了!接下来我给大家分享下多位大牛倾力打造的python系统学习流程,一个月才设计完的! Pytho ...

  8. Docker学习六:综合实践

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  9. linux中ftp的工作原理,Linux系统学习 十二、VSFTP服务—简介与原理

    1.简介与原理 互联网诞生之初就存在三大服务:WWW.FTP.邮件 FTP主要针对企业级,可以设置权限,对不同等级的资料针对不同权限人员显示. 但是像网盘这样的基本没有权限划分. 简介: FTP(Fi ...

最新文章

  1. linux在多核处理器上的负载均衡原理
  2. python中forward函数的引用_调用没有.forward()的forward函数
  3. struts导出txt文件
  4. pyqy5——控件2
  5. C# WinForm开发系列 - GDI+【转】
  6. 谷歌补丁Android官网,谷歌已发布 19年12月 Android 安全补丁
  7. Android CoordinatorLayout
  8. Win 7退役,这些Linux发行版可以替代
  9. android编译framework架包运行报错 (转)
  10. android ndk 下载安装(ubuntu)
  11. C++ QT中国象棋项目讲解(三) 单机双人对战走棋
  12. python右对齐输出乘法表_Python 第6讲 打印九九乘法表
  13. 3D模型贴图算法归纳讨论,以及OpenGL渲染器中的数据格式——篇1:模型展开算法与UV贴图
  14. 第二次作业 时事点评
  15. 春天不健脾养胃 也要等什么时候
  16. Linux内核抢占机制(preempt)
  17. VIO--后端优化实践(坑)
  18. C语言system讲解
  19. adlds文件服务器,window_Windows Server 2008:AD LDS应用攻略,本文我们共同了解一下AD LDS的 - phpStudy...
  20. OAuth 2.0 笔记 (1) 世界观

热门文章

  1. 复数类 java_用java写一个复数类Complex
  2. hash trick在机器学习中的使用
  3. python怎么做方差分析_Python进行单因素方差分析
  4. ava - 找不到项目 ‘org.springframework.boot:spring-boot-starter-parent:2.4.0‘
  5. logrotate按天滚动nginx日志
  6. 用计算机算出陈赫手机号码,陈赫录制视频让素人遭殃,猜手机号却曝别人号码,网友被骚扰数日...
  7. 基于Spring MVC + Spring + MyBatis的【图书资源管理系统】
  8. 商城APP开发功能需求解析
  9. 广数980tc3尾座锁定代码_数控车床的编程方法
  10. 【flutter】A RenderFlex overflowed by xxx pixels on the right