Swift5.2连载

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);

上一篇下一篇

猜你喜欢

热点阅读