swift学习笔记(3)-字符串

为什么Swift不允许字符串使用===判断?Swift字符串默认编码?字符串默认编码?哪些编程语言支持字符串插值?各式各样的字符串类型? 摘要:本文探讨Swift字符串特性,包括为何禁用===运算符(因其为值类型),以及默认编码从ASCII/UTF-16转向UTF-8的演进。对比各语言(如C/C++、Java、Python等)的字符串编码差异,分析主流语言对字符串插值的支持方式(如C#的$语法、JS的模板字面量),解析插值技术的实现本质(如C#通过string.Format转化)。最后列举不同语言的字符串类型设计特点(如Go的值类型字符串、JS的基本字符串与对象区别),为开发者提供跨语言字符串处理的技术参考。(149字) 阅读详情

初始化空字符串

var emptyString = ""               // 空字符串字面量
var anotherEmptyString = String()  // 初始化方法
// 两个字符串均为空并等价。

您可以通过检查其Bool类型的isEmpty属性来判断该字符串是否为空:

if emptyString.isEmpty {
    print("Nothing to see here")
}
// 打印输出:"Nothing to see here"

字符串可变

var可变、let不可变,在 Objective-C 和 Cocoa 中,您需要通过选择两个不同的类(NSString和NSMutableString)来指定字符串是否可以被修改。

使用字符

您可通过for-in循环来遍历字符串中的characters属性来获取每一个字符的值:

for character in "Dog!".characters {
    print(character)
}
// D
// o
// g
// !

另外,通过标明一个Character类型并用字符字面量进行赋值,可以建立一个独立的字符常量或变量:

let exclamationMark: Character = "!"

连接字符串和字符

+

let string1 = "hello"
let string2 = " there"
var welcome = string1 + string2
// welcome 现在等于 "hello there"

+=

var instruction = "look over"
instruction += string2
// instruction 现在等于 "look over there"

append()

let exclamationMark: Character = "!"
welcome.append(exclamationMark)
// welcome 现在等于 "hello there!"

字符串插值

let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
// message 是 "3 times 2.5 is 7.5"

字符串字面量的特殊字符

转义字符\0(空字符)、\(反斜线)、\t(水平制表符)、\n(换行符)、\r(回车符)、\”(双引号)、\’(单引号)。
Unicode 标量,写成\u{n}(u为小写),其中n为任意一到八位十六进制数且可用的 Unicode 位码。

可扩展的字形群集

要用再查Unicode编码表

let eAcute: Character = "\u{E9}"                         // é
let combinedEAcute: Character = "\u{65}\u{301}"          // e 后面加上  ́
// eAcute 是 é, combinedEAcute 是 é

计算字符数量

如果想要获得一个字符串中Character值的数量,可以使用字符串的characters属性的count属性:

let unusualMenagerie = "Koala 

字符串索引

每一个String值都有一个关联的索引(index)类型,String.Index,它对应着字符串中的每一个Character的位置。

前面提到,不同的字符可能会占用不同数量的内存空间,所以要知道Character的确定位置,就必须从String开头遍历每一个 Unicode 标量直到结尾。因此,Swift 的字符串不能用整数(integer)做索引。

使用startIndex属性可以获取一个String的第一个Character的索引。使用endIndex属性可以获取最后一个Character的后一个位置的索引。因此,endIndex属性不能作为一个字符串的有效下标。如果String是空串,startIndex和endIndex是相等的。

通过调用 String 的 index(before:) 或 index(after:) 方法,可以立即得到前面或后面的一个索引。您还可以通过调用 index(_:offsetBy:) 方法来获取对应偏移量的索引,这种方式可以避免多次调用 index(before:) 或 index(after:) 方法。

你可以使用下标语法来访问 String 特定索引的 Character。

let greeting = "Guten Tag!"
greeting[greeting.startIndex]
// G
greeting[greeting.index(before: greeting.endIndex)]
// !
greeting[greeting.index(after: greeting.startIndex)]
// u
let index = greeting.index(greeting.startIndex, offsetBy: 7)
greeting[index]
// a
试图获取越界索引对应的 Character,将引发一个运行时错误。

greeting[greeting.endIndex] // error
greeting.index(after: endIndex) // error
使用 characters 属性的 indices 属性会创建一个包含全部索引的范围(Range),用来在一个字符串中访问单个字符。

for index in greeting.characters.indices {
   print("\(greeting[index]) ", terminator: "")
}
// 打印输出 "G u t e n   T a g ! "

注意:
您可以使用 startIndex 和 endIndex 属性或者 index(before:) 、index(after:) 和 index(_:offsetBy:) 方法在任意一个确认的并遵循 Collection 协议的类型里面,如上文所示是使用在 String 中,您也可以使用在 Array、Dictionary 和 Set中。

插入和删除

调用 insert(_:at:) 方法可以在一个字符串的指定索引插入一个字符,调用 insert(contentsOf:at:) 方法可以在一个字符串的指定索引插入一个段字符串。

var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// welcome 变量现在等于 "hello!"

welcome.insert(contentsOf:" there".characters, at: welcome.index(before: welcome.endIndex))
// welcome 变量现在等于 "hello there!"

调用 remove(at:) 方法可以在一个字符串的指定索引删除一个字符,调用 removeSubrange(_:) 方法可以在一个字符串的指定索引删除一个子字符串。

welcome.remove(at: welcome.index(before: welcome.endIndex))
// welcome 现在等于 "hello there"

let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
// welcome 现在等于 "hello"

注意: 您可以使用 insert(:at:)、insert(contentsOf:at:)、remove(at:) 和 removeSubrange(:) 方法在任意一个确认的并遵循 RangeReplaceableCollection 协议的类型里面,如上文所示是使用在 String 中,您也可以使用在 Array、Dictionary 和 Set 中。

比较字符串

Swift 提供了三种方式来比较文本值:字符串字符相等、前缀相等和后缀相等。
字符串/字符相等
字符串/字符可以用等于操作符(==)和不等于操作符(!=),详细描述在比较运算符:

let quotation = "We're a lot alike, you and I."
let sameQuotation = "We're a lot alike, you and I."
if quotation == sameQuotation {
    print("These two strings are considered equal")
}
// 打印输出 "These two strings are considered equal"

如果两个字符串(或者两个字符)的可扩展的字形群集是标准相等的,那就认为它们是相等的。在这个情况下,即使可扩展的字形群集是有不同的 Unicode 标量构成的,只要它们有同样的语言意义和外观,就认为它们标准相等。

// "Voulez-vous un café?" 使用 LATIN SMALL LETTER E WITH ACUTE
let eAcuteQuestion = "Voulez-vous un caf\u{E9}?"

// "Voulez-vous un café?" 使用 LATIN SMALL LETTER E and COMBINING ACUTE ACCENT
let combinedEAcuteQuestion = "Voulez-vous un caf\u{65}\u{301}?"

if eAcuteQuestion == combinedEAcuteQuestion {
    print("These two strings are considered equal")
}
// 打印输出 "These two strings are considered equal"

前缀/后缀相等

通过调用字符串的hasPrefix(:)/hasSuffix(:)方法来检查字符串是否拥有特定前缀/后缀,两个方法均接收一个String类型的参数,并返回一个布尔值。

下面的例子以一个字符串数组表示莎士比亚话剧《罗密欧与朱丽叶》中前两场的场景位置:

let romeoAndJuliet = [
    "Act 1 Scene 1: Verona, A public place",
    "Act 1 Scene 2: Capulet's mansion",
    "Act 1 Scene 3: A room in Capulet's mansion",
    "Act 1 Scene 4: A street outside Capulet's mansion",
    "Act 1 Scene 5: The Great Hall in Capulet's mansion",
    "Act 2 Scene 1: Outside Capulet's mansion",
    "Act 2 Scene 2: Capulet's orchard",
    "Act 2 Scene 3: Outside Friar Lawrence's cell",
    "Act 2 Scene 4: A street in Verona",
    "Act 2 Scene 5: Capulet's mansion",
    "Act 2 Scene 6: Friar Lawrence's cell"
]

您可以调用hasPrefix(_:)方法来计算话剧中第一幕的场景数:

var act1SceneCount = 0
for scene in romeoAndJuliet {
    if scene.hasPrefix("Act 1 ") {
        act1SceneCount += 1
    }
}
print("There are \(act1SceneCount) scenes in Act 1")
// 打印输出 "There are 5 scenes in Act 1"

相似地,您可以用hasSuffix(_:)方法来计算发生在不同地方的场景数:

var mansionCount = 0
var cellCount = 0
for scene in romeoAndJuliet {
    if scene.hasSuffix("Capulet's mansion") {
        mansionCount += 1
    } else if scene.hasSuffix("Friar Lawrence's cell") {
        cellCount += 1
    }
}
print("\(mansionCount) mansion scenes; \(cellCount) cell scenes")
// 打印输出 "6 mansion scenes; 2 cell scenes"

注意:
hasPrefix(:)和hasSuffix(:)方法都是在每个字符串中逐字符比较其可扩展的字符群集是否标准相等,详细描述在字符串/字符相等。

Swift语言的字符串处理 在Swift开发中,字符串处理是一个得心应手的工具。通过本文的介绍,我们对Swift的字符串处理有了更深入的认识,包括字符串的创建、修改、比较、查找、格式化等功能。这些基本操作是每位 iOS/macOS 开发者必备的技能。随着项目的复杂性增加,文字处理的需求会越来越多,对字符串的深度理解将帮助我们编写出更健壮和高效的代码。希望通过这篇文章,能够帮助到正在学习和使用Swift的开发者,在日后的开发工作中充分利用字符串处理功能,提高开发效率! 阅读详情

相关推荐

GEO优化实战:用AnswerBit量化AI搜索可见度与品牌监控体系

生成式引擎优化(GEO)正取代传统SEO,成为品牌在AI搜索生态中获取可见度的关键。当用户习惯从“翻列表”转向“直接问AI”,品牌能否被生成式引擎识别、引用并正向推荐,直接决定了其在用户决策链条中的存在感。AI搜索可见度因此从模糊概念演变为可度量的运营指标,涵盖提及率、引文率、情感分与回源质量等维度。腾讯AnswerBit作为答案侧分析工具,帮助运营者拆解AI回复中的品牌语境与引用来源,让优化动作有据可循。从内容结构化改造、品牌实体建设到第三方权威背书,GEO要求团队建立“度量-优化-再度量”的闭环。文章结

weixin_31100517的博客 148

Swift 3.0 学习笔记-2-字符串和Unicode

Swift 3.0 学习笔记-2-字符串和Unicode标签(空格分隔): iOS Swift声明 Swift 3.0 学习笔记主要参考苹果开发者官网[The Swift Programming Language (Swift 3.1)教程][1] 以及 [Swift 中文网][2]。Swift 30 学习笔记-2-字符串和Unicode 字符串String 1 字符串字面量 2 初始化空字符串

KAKADEE BLOG 2684

APS生产排程系统——ERP、MES、APS系统的关联和区别

APS生产排程系统——ERP、MES、APS系统的关联和区别

这里有一只小马吖 2万+

Swift3.0学习笔记----遍历字符串

我试图用for in结构来遍历字符串,如下代码 var word = "ABCD" for i in word { print(i) } 但是在for循环中就已经出错了 一直提示String不符合某个类型。 经过查找资料得到下列解决办法 一:作为的 Swift 3, String 不符合 SequenceType 。但是,您可以使用 characters 属性 String.char

太匆匆 4159

COD论文笔记VSCode: General Visual Salient and Camouflaged Object Detection with 2D Prompt Learning

VSCode模型通过引入领域特定提示和任务特定提示,结合提示区分损失,成功地在单一模型中处理多个显著目标检测和伪装目标检测任务。这种方法不仅提高了模型的性能,还展示了其对未见任务的泛化能力。作者使用 Visual saliency transformer ICCV 2021 作为baseline model这张图展示了VSCode模型的整体框架,特别强调了2D提示学习方法。

985小菜鸡 1625

WRF所需气象数据的下载方法

#数据下载是个大问题,巧妇难为无米之炊,没有数据就无法模拟啦,疫情期间国外服务器响应慢,打开网页慢都很正常啦~ WRF数据所需要的外部数据分为两种:静态地理数据,grib格式的气象数据(NAM、GFS、RUC、AGRMET等)。静态地理数据可以从WRF官网获得,比较简单,这里不做介绍。所以这篇日志重点介绍的是气象数据的获取。 提前说明,WRF官网不提供气象数据,但WRF官网提供各类气象数据的下载网址链接,所以我们下载一般还是从WRF官网开始。首先进入WRF官网,然后点击WRF ARW Uusres’ .

六出的博客 1万+

Swift3.0学习笔记-The Basics(对比Java)

Swift学习,以Java做对比。

brycegao321的博客 1933

①电子产品拆解分析-暖手宝

电子产品拆解分析-暖手宝 ①按键三档调温暖手; ②长按进入氛围呼吸灯; ③安卓接口充电以及支持USB输出;

a6662580的博客 5291

Swift苹果官方教程文档阅读和学习

入门文档 Guide Book:https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html Swift Feature: https://developer.apple.com/swift/ 问题记录 Swift Feature 值类型 And Swift heavily leverages value types, especially for commonly used types like Arrays and Diction

mingC0758的博客 1981

node: /lib64/libstdc++.so.6: version `CXXABI_1.3.11‘ not found (required by node) 解决方案

本文主要介绍了node: /lib64/libstdc++.so.6: version `CXXABI_1.3.11’ not found (required by node) ,希望能对使用nodejs的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

【100%通过率】华为OD机试真题 C++ 实现【水库蓄水问题】【2022.11 Q4 新题】

给定一个长度为 n 的整数数组height。数组的元素表示山的高度,选择两个元素作为水库的边界,求蓄水量的最大值并输出蓄水量最大时的边界下标(蓄水量相同时输出下标较近的)。

MISAYAONE的博客 1万+

Swift学习笔记&SwiftUI初尝试

都为 false ,其他的则都为 true。true 取反使用。

Vinemoon的博客 2284

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Swift学习笔记

在第一行代码中,通过使用命名型类型 Array创建了一个字符串类型的数组,其中 SomeType 是这个数组中唯一允许存在的数据类型。在第二行代码中,使用像 SomeType[]这样的简单语法创建了一个类型为浮点数的数组floatArray。前面两种方法都是通过显式的类型标注创建指定类型的数组。在第三行代码中,通过给常量设置默认值,从而由Swif 对其类型做出推断。因为所有值都是整数类型,所以数组的类型被推些为整型数组。

liang060602的博客 1626

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Swift-字符串截取、替换、插入

Swift中关于字符串的截取与OC还是有很大的区别的,要说字符串的截取,就要先说下“范围”,OC中使用的是NSRange函数来指示一个起始位置和长度,而Swift中的范围使用起来就方便得多,有两种形式: 1...5表示闭区间[1,5],也就是从1到5的范围。 1..&amp;amp;amp;lt;5表示闭区间[1,5),也就是从1到4的范围。 例如: for index in 1...5 { ...

SSY_1992的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Swift学习笔记——字符串的使用

在Swift中,字符串是值类型。 1、String值在传递给方法或者函数的时候会被复制过去 2、赋值给常量或者变量的时候也是一样 3、Swift编译器优化了字符串使用的资源,实际上拷贝只会在确实需要的时候才进行 示例代码: let mulStr = 3 let msg = "\(mulStr) times 2.5 is \(Double(mulStr) * 2.5)" 字符串拼接 1、使用加运算符(+)创建新字符串 2、使用加赋值符号(+=)在已经存在的String值末尾追加一个String值 3

Homezzh的博客 1681

swift 字符串和字符 换行

Swift的字符串类型与Foundation的NSString类连接。Foundation还扩展了字符串来公开由NSString定义的方法。这意味着,如果您导入Foundation,您可以在字符串中访问这些NSString方法,而不需要进行强制转换。 单行字符串 let someString = "Some stirng" 多行文本 多行文本使用 """ 内容 """ 没错,就是三个引...

C 9366

Swift学习笔记2

Swift数组使用有序列表存储同一类型的多个值,相同的值可以多次出现在一个数组的不同位置数组中元素类型不同会报错将数组赋值给一个变量,则创建的集合就可以修改。

2401_87573207的博客 1940

如何将Swift数组转换为字符串?

I know how to programmatically do it, but I'm sure there's a built-in way... 我知道如何以编程方式进行操作,但是我敢肯定有

asdfgh0077的博客 5785

【学习笔记】swift 基础部分 3

声明,由于环境限制 ,swfit 学习测试时,手边没有现成的Xcode 提供测试,而是使用网页的Swift测试 工具,因网页工具的局限,存在部分语句用法无法通过编译,故,下文会出现“需要验证”的字样。由于样例来源为前文提到,所以样例多半可以在xcode 运行,但没有测试不敢保证。 字符串字面量 字符串字面量是由双引号 ( "" ) 包裹着的具有固定顺序的文本字符集 字符串字面量可

幺客的专栏 1851

Swift学习笔记之---字符串

字符串 字符串是一组字符的集合,C语言采用字符数组来作为字符串类型,Objective-C语言中封装了面向对象地字符串类型NSString,并向其中封装了大量的相关方法。Swift是一种弱化指针的语言,它提供了String类型和Character类型来描述字符串和字符。 集合类型是用于描述一组数据的集合体,例如一组整数组合在一起形成的整数集合,一组字符串组合在一起形成的字符串集合等,在Swift语言中一共提供了3中集合类型,即Array数组、Set集合和Dictionary字典。 初始化空字符串 v

StuTan 890

2.3 Swift字符串比较

let str = "hello"                  // >= !=   都可以啊         if str == "hello"         {             print(str)         }                  if str < "heoo"         {

Rancher的博客 7004

swift3-字符/字符串

1. String1.1 字符和字符串的定义//字符 var a: Character = "我"//字符串常量 let a = "123" //字符串变量 var b = "123" //声明为nil, var c:String? //空字符串 let d = String() //空字符串 提倡用这样的字面量语法声明,类型可不指定,swift自动识别 var e = ""1.2 判断字符串//判

shenhaifeiniao的博客 3790

Swift字符串多行的写法

在swift中字符串是双引号("")表示,例如"张三","李四","abc","123" 那么多行字符串改如何表示呢? 1.普通的字符串 var str = "Hello, playground" 2.多行字符串 let moreRows = """ 我是第一行:"我是字符串" 我是第二行:小明今天\(10)岁了 我是第三行:小明的爱好有\n踢球,游泳,画画\t还有看书和唱歌 """ 运行结果 从运行结果,我们可以看出,在swift中多行字符串用”“” “”“ 来表示,在这中间的区域.

俊而不逊的博客 3088

Swift 字符串和字符

字符串是一系列字符的集合,例如。Swift 的字符串通过String类型来表示。而String内容的访问方式有多种,例如以Character值的集合。Swift 的String和Character类型提供了一种快速且兼容Unicode的方式来处理代码中的文本内容。创建和操作字符串的语法与C语言中字符串操作相似,轻量并且易读。通过符号就可以非常简单的实现两个字符串的拼接操作。与 Swift 中其他值一样,能否更改字符串的值,取决于其被定义为常量还是变量。

xiaoxiaobukuang的专栏 1447
上一篇: swift学习笔记(2)-基本运算符
下一篇: swift学习笔记(4)-集合类型
winterLiao
博客等级 码龄10年 5粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值