Swift字符串(3)
2020-07-07 本文已影响0人
_菩提本无树_
教程目录
与OC一样的内容不重复介绍
字符串和字符
2020.07.07(第一更)
一.定义字符串
func buildStr() {
//定义字符串
let str = "系统会自动推断为字符串";
let str1: String = "我们自己告诉str1对象这是字符串";
let str2: String? = "声明一个可选类型的字符串对象str2,告诉系统str2可以为nil,使用时要解包";
var str3 = "";//这是一个空字符串
var str4 = String();//初始化一个字符串
str4 = "字符串赋值";
let str5 = String(format: "%@%@", arguments: [str,str1])
let str6 = String(format: "%@%@", str,str1);
//判断字符串是否为空
if str4.isEmpty {
print("字符串为空")
}
let str13 = """
这是
多行
字符串的
声明方式
""";
//对于换行的这个"""用法很有讲究,但是不打算深研究,因为基本用不到,所以到此为止,知道就行
}
转义字符
\0(空字符)、\\(反斜线)、\t(水平制表符)、\n(换行符)、\r(回车符)、\"(双引号)、\'(单引号)。
二.可变字符串和不可变字符串
swift中字符串不分可变和不可变,而是通过let和var来确定的
//定义一个可变字符串
var str7: String? = "111";
//定义一个不可变字符串
let str8: String?;
str8 = "123";
三.字符串是值类型
这个跟OC中的内容有牵扯了.在OC中方法参数传递时是值传递,传递的是存储值的指针.在swift中同样如此,字符串传递的依旧是值,将原始的值拷贝一份传递下去,双方不受影响.实际过程中苹果是有优化的,不一定每次都重新拷贝,只有在必要的时候才会真正的拷贝,当然不需要我们操心了.
四.字符
/// 字符的使用
func character() {
let str = "qwertyuiop";
for character in str {
print(character);
}
//字符只能包含一个字符
//定义一个字符
let character: Character = "a";
//定义一个字符数组
let characters: [Character] = ["a","b"];
}
五.字符串插值
这是个新的东西,比较实用的功能
/// 字符串插值
func insertStr() {
let str = "333";
let str2 = "\(str)金子\(str)银子\(str)票子";
print(str2);
//打印结果:333金子333银子333票子
let str3 = "\(str)金子\(str.count)票子";
print(str3);
//打印内容:333金子3票子
let num: [String] = ["测试","是否可以取值"];
let str4 = "第\(num.count)\(num.first ?? "默认值")\(num.last ?? "没事哈哈")";
print(str4);
//打印内容:第2测试是否可以取值
}
使用方法将需要插入的值使用\()包含放到字符串即可,比oc少写不少代码.而且可以看出来字符串插值,可以插入属性这些东西,真的很好用
六.字符串常用的方法
下面的内容才是我们常用的东西,好好看
Swift字符串截取(两种形式)
先学习String.index
/// 学习构造StringIndex
/// - Returns: void
func buildStringIndex() -> () {
//为什么使用String.Index呢?因为不同的字符可能占用不同数量的内存空间,所以要知道 Character 的确定位置,就必须从 String 开头遍历每一个 Unicode 标量直到结尾。因此,Swift 的字符串不能用整数(integer)做索引。
//接下来就开始定义String.Index了
let str = "asdfghjkl";
//获取第一个字符的index
let strFirstIndex = str.startIndex;
//获取最后一个字符的index,注意⚠️:这个endIndex不能直接使用会越界的
let strLastIndex = str.endIndex;
//获取某个坐标之前的坐标. endIndex这个时候可以用
let strBeforeIndex = str.index(before: strLastIndex);
//获取某个坐标之后的坐标
let strAfterIndex = str.index(after: str.startIndex);
//获取从头部开始数第三位的坐标
let strAssignIndex = str.index(str.startIndex, offsetBy: 3);
//获取从第三位开始数第二位的坐标,即第五
let strFiveIndex = str.index(strAssignIndex, offsetBy: 2);
//与上面的方法类似,只不过增加了范围限制
let strLimiteIndex = str.index(strAssignIndex, offsetBy: 2, limitedBy: strFiveIndex);
//获取的是从开始到结束位置之间的距离,
let strDistanceIndex = str.distance(from: str.startIndex, to: strAssignIndex);
}
第一种方式通过String.index
/// 使用StringIndex方式截取字符串
/// - Returns: void
func strSubByStringIndex() -> () {
let str = "asdfghjkl";
//注意坐标初始值为0
//获取第一个字符
let strFirstIndex = str.startIndex;
print(str[strFirstIndex]);//a
//获取最后一个字符的index,注意⚠️:这个endIndex不能直接使用会越界的
let strLastIndex = str.endIndex;//这个不能直接使用需要组合使用
//获取某个坐标之前的字符. endIndex这个时候可以用
let strBeforeIndex = str.index(before: strLastIndex);
print(str[strBeforeIndex]);//l
//获取某个坐标之后的字符
let strAfterIndex = str.index(after: str.startIndex);
print(str[strAfterIndex]);//s
//获取从头部开始数第三位的字符
let strAssignIndex = str.index(str.startIndex, offsetBy: 3);
print(str[strAssignIndex]);//f
//获取从第三位开始数第二位的字符,即第五
let strFiveIndex = str.index(strAssignIndex, offsetBy: 2);
print(str[strFiveIndex]);//h
//这个方法和上面的基本一致,只不过限制了一下范围,而且得加判断,因为他的返回值是String.Index?,可选类型
let strLimiteIndex = str.index(strAssignIndex, offsetBy: 2, limitedBy: strAssignIndex);
if let i = strLimiteIndex {
print(str[i]);
}else{
print("越界")
}
//返回某个String.Index后的所有字符串,包括String.Index当前位置的字符串
let strSuffix = str.suffix(from: strFiveIndex);
print(strSuffix);//hjkl
//返回某个String.Index之前的所有字符串,不包括String.Index当前位置的字符串
let strPrefix = str.prefix(upTo: strFiveIndex);
print(strPrefix);//asdfg
//截取strFiveIndex之后的字符串,包括String.Index当前位置的字符串
let strLenAfter = str[strFiveIndex...];
print(strLenAfter);//hjkl
//截取strFiveIndex之前的字符串,包括strFiveIndex当前位置的字符串
let strLenBefore = str[...strFiveIndex];
print(strLenBefore);//asdfgh
//截取strFiveIndex之前的字符串,不包括strFiveIndex当前位置的字符串
let strLenBefore1 = str[..<strFiveIndex];
print(strLenBefore1);//asdfgh
//截取两个String.Index之间的字符串,包括strFiveIndex当前位置的字符串
let strBetween = str[strAfterIndex...strFiveIndex];
print(strBetween);//sdfgh
//截取两个String.Index之间的字符串,不包括strFiveIndex当前位置的字符串
let strBetween1 = str[strAfterIndex..<strFiveIndex];
print(strBetween1);//sdfg
}
第二种方式通过NSRange
/// 通过range截取字符串
func strSubByRange() {
let str = "asdfghjkl";
let range = NSMakeRange(3, 3);
let strStartIndex = str.index(str.startIndex, offsetBy: range.lowerBound);
let strEndIndex = str.index(str.startIndex, offsetBy: range.upperBound);
//包含strEndIndex
print(str[strStartIndex...strEndIndex]);
//不包含strEndIndex
print(str[strStartIndex..<strEndIndex]);
}
以上两种截取字符串的方式,开发中已经足够了
字符串其他用法
/// 字符串的其他用法
func strOtherFunc() {
var str = "asdfghjklaaffaaa";
//声明一个range,String.index的区间
let rangeTestOne = str.startIndex...str.index(str.startIndex, offsetBy: 3);
//拼接字符串
str.append("bbb");
print(str);
//删除指定字符,字符是一个,只删除最先找到的,后面的不删除
//先找到位置
let index = str.firstIndex(of: "f");
if let i = index {
str.remove(at: i);
}
print(str);
//删除多个字符
let range = NSMakeRange(0, 4);
let bounds = Range.init(range, in: str);
if let b = bounds {
str.removeSubrange(b);
}
print(str);
//还有一种声明range的方式,可能要简单直观些
let rangeTest = str.startIndex..<str.index(str.startIndex, offsetBy: 1);
str.removeSubrange(rangeTest);
print(str);
//字符串转数组
let arr = str.components(separatedBy: "f");
print(arr);
//字符串比较
let test = "123";
let result = str.compare(test);
print(result)
//字符串是否包含
if str.range(of: "asd") != nil {
print("包含")
}
//替换,所有的都会被替换
let replace = str.replacingOccurrences(of: "a", with: "3");
print(replace);
//区间替换,区间内的内容都被替换
let rangeOne = Range.init(NSMakeRange(0, 3), in: str);
if let range = rangeOne {
str.replaceSubrange(range, with: "????");
}
print(str);
//前后缀检测
if str.hasSuffix("asd") {
}
if str.hasPrefix("asd") {
}
}
字符串更新完毕,更多精彩内容见目录本文完整代码地址
总结
1.字符串拼接字符不能使用+,正确姿势strVar.append(char);