Swift 4.0学习之旅—字符串和字符

 //在swift中 String 可以调用OC中的 NSString方法 不用进行转换
        //字符串的字面量 可以用于为常量和变量提供初始值
        let str = "hello world"
        
        //多行字符串字面量 与oc /**/注释相似
        let string = """
                    a
                    b
                    c
                    d
                    e
                    """
        print(string)
        
        //上面代码中 换行已经包含在内 如果不想这么写还想要有换行 用\n来代替 与oc一样
        let hh = "hello \n world"
        print( hh)
        
        //在多行中不希望有多行样式 在""" 字符串中 每行字符串尾部用\ 来当做续行 不是换行 """
        //这样方便可读性
        //但是""" 符号必须独占一行才行
        let hello = """
        hello world duo hang \
        i love the world
        """
        
        //在多行中 以末尾"""符号位置为基准 若各行有字符创超出了末尾 """ 则超出的部分包含在字符串中
        print("""
        123
         456
          789
        """)
        //超出某位的"""第一个“符号 都作为空格来处理
        
//        print("""
//    123
//        456
//        789
//        """)
//这么写或报错 说是以下各行缩进不足 所以 所有的字符串换行后 都不能超过某位的”“”位置
        
        //转义字符
//  \0 空字符 \\反斜线 \t水平制表符 \n换行符 \r回车符 \"双引号 \'单引号
        
        //Unicode标量 写成\u{n} u为小写,n为任意一到八位十六进制数切可用的unicode编码
        
        print("\"注释 \"")
        print("\u{24}")
        print("\u{2665}")
        print("\u{1F496}")
        
        //若在多行字符串中使用""" 必须要用一个\符号来转义
        print("""
        Escaping the first quote \"""
        Escaping all three quotes \"\"\"
        """)
        
        //初始化一个空字符串
        var nilStr = ""
        var emptyStr = String()
        //以上两个字符串为空 且等价
        
        //判断字符串是否为空
        if nilStr.isEmpty{
            print("empty str")
        }
        
        //字符串可变性 var为变量
        var variablestr = "hello"
        variablestr += " world"
        
        let str1 = "hello"
//        str1 += "world"//此时报错 因为str1定义为常量
        
        //for in 语句来循环输出 字符串中没每个字符
        
        for 字符 in "hello world"{
            print(字符)
        }
        
        //可以通过 character 来定义 并进行字符字面量赋值,可以作为一个独立的字符量或变量
        let worldI : Character = "i"

        //可以把一个字符集合 通过String来初始化成一个字符串
        let chars : [Character] = ["a","b",worldI]
        let charStr = String(chars)
        print(charStr)
        
        //使用加号来连接两个字符串
        let string1 = "string1"
        let string2 = "string2"
        var string3 = string1 + string2
        
//        var string4 = string3 + worldI 类型不同,不能相加
        let string5 : NSString = "oc"
        
//        var string6 = string3 + string5 类型不同 得强转
         var string6 = string3 + (string5 as String)
        
        print(string3,string6)
        
        //使用+= 来将一个字符串添加到一个已经存在的字符串变量上
        var string7 = "default"
        string7 += string6
        
        //使用append 将一个字符追加到一个字符串的尾部 也可以是字符串 append方法可以追加很多
        let charchar : Character = "i"
        string7.append(charchar)
        string7.append(string1)
        
        //Unicode 用于文本的编码和表示 可以用标准格式表示来自任意语言几乎所有的在字符,并能够对文本或网页这样的外部资源中的在字符进行读写操作,Swift的string 和 character 类型是完全兼容Unicode
        //Unicode标量
        //Swift 的string类型是基于Unicode标量简历的。Unicode标量是对应字符或者修饰符的唯一的21位数字
        //Unicode码位的范围 U+0000 到 U+D7FF 或者 U+E000 到 U+10FFFF
        //Unicode标量不八廓Unicode代理项码位 范围是 U+D800 到 U+DFFF
        //不是所有的21位Unicode 标量都代表一个字符
        
        
        //单一标量
        let eacute : Character = "\u{E9}" //é
        //两个标量字形群
        let combineddeacute : Character = "\u{65}\u{301}"
        print(eacute,combineddeacute)

        
        //单一标量
        let precomposed : Character = "\u{D65c}"
        //组合标量排序 为同一个字
        let decomposed : Character = "\u{1112}\u{1161}\u{11AB}"
        print(precomposed,decomposed)

        //测试标量组合 不能颠倒
//        let teststr : Character = "\u{1161}\u{1112}\u{11AB}"
//        print(teststr)
        
        //可扩展的字符群可以使包围记号 U+20DD 标量包围其他Unicode标量,作为一个单一的character值
        print("\u{E9}\u{20DD}") //é⃝  圆形包含
        
        //地域性指示符号Unicode 标量可以组合成一个单一的character值
        // US 符号 组合 U (U+1F1FA)  S (S+1F1F8)
        print("\u{1F1FA}\u{1F1F8}") //🇺🇸 美国国旗
        
        
        
        //字符数量 用count 来知道字符串内含有多少个字符
        let teststring = "hello world"
        print("teststring has \(teststring.count) charracter")
        
        //使用字符群集作为 character值来改变字符串时,并不一定会改变字符串数量
        var word = "cafe"
        print(word + "has \(word.count) character")
        
        word += "\u{301}"
        
        print("\(word) has \(word.count) character")
        
        //NSString 的 length数量 与 Unicode 数量并不总是是相同
        //NSString 是 UTF-16表示的单元数字
        
        //Swift string值关联的索引类型 string.index 对应每个character的位置
        //Swift 中 字符串不能用 integer做索引
        
        //用startIndex 获取一个string 的第一个character索引 使用endIndex获取最后一个character位置的索引
        //但是 endIndex不能作为一个字符串的邮箱下标 如果 stirng 为空串 startindex 与endindex相等
        
        //可以使用 string index(before:)获取某一下标前面  index(after:)获取某一下标后面  index(_:offsetby:)获取某一下标的偏移量 避免多次使用前两个
        //三种方法也可以用在 array dictionary set中
        
        let indexString = "hello world"
        
        print(indexString[indexString.startIndex])
        
//        print(indexString[indexString.endIndex]) 代码出错 因为endindex 为字符串最后一个字符末尾 往后一位为空字符
        
        print(indexString[indexString.index(before: indexString.endIndex)]) //d
        print(indexString[indexString.index(after: indexString.startIndex)]) //e
        print(indexString[indexString.index(indexString.startIndex, offsetBy: 5)]) //因为空格 所以看不出来
        print(indexString[indexString.index(indexString.startIndex, offsetBy: 6)]) //w
        
        //indices  为字符串所有索引范围 range 用来访问单个字符   indices 目录
        for indexx in indexString.indices{
//            print(indexString[indexx])
            print(indexString[indexx], separator:"-", terminator: " ") //由于打印的是单个字符 所以连接符没有起到作用
            //terminator 默认是添加换行符,若果换成别的 就不起到换行效果,会连接下个print语句打印的内容
        }
        
        print(indexString.indices)
        
        //插入
        var welcome = "welcome"
        //在末尾加一个感叹号 在一个指定索引加一个单个字符
        welcome.insert("!", at: welcome.endIndex)
        print(welcome)
        
        //在感叹号前加一段 字符串 在一个指定索引加一段字符串
        welcome.insert(contentsOf: " to China", at: welcome.index(before: welcome.endIndex))
        print(welcome)
        
        //删除某个下标的字符
        welcome.remove(at: welcome.index(before: welcome.endIndex))//删除感叹号
        print(welcome)
        
        //删除一端 指定范围的字符串
        welcome.removeSubrange(welcome.index(welcome.endIndex, offsetBy: -8)..<welcome.endIndex)//删除to china
        print(welcome)
        
        //子字符串
        let testSTR = "hello,world"
        let index_ = testSTR.index(of: ",") ?? testSTR.endIndex  //义为 字符串testSTR 中有”,“ 这个字符下标吗 有的话就用这个字符下标 ,没有的话 就用末尾下标
        let fix = testSTR[..<index_] //往字符串里传一个范围 返回这个范围内的所以字符串
        //此时 fix 为substring类型的实例 需要另起一个string 类型的 去接收以便长久化
        
        let newFix = String(fix)
        
        print(fix,newFix)//hello hello
        
        //string 与substring 区别在于性能优化上,substring 可以重用原string 的内存空间,或者另一个substring,string也一样
        //意味着在修改string 和substring 之前都不需要消耗内存去复制内存。可以直接修改
        
        //疑问 若果修改substring 会不会修改原string
        
        var sourstr = "helloworld"
        var substr = String(sourstr[sourstr.startIndex..<sourstr.index(sourstr.startIndex, offsetBy: 5)])
        print(substr)
        
        substr = "welcome"
        print(sourstr) //事实不会
        
        //string 与substring 都可以调用 stringprotocol的函数
        
        //字符串比较 三种比较方式  字符串字符相等,前缀和后缀相等
        
        let me = "i like you"
        let me1 = "i like you"
        
        let you = "you like i" //me
        
        if me == me1{
            print("same string")
        }
        
        //如果两个字符串的可扩展字形集群是相等的,那它们就是相等的,在这个情况下,即使可扩展的字形集群集是有不同的Unicode标量构成的,只要它们有相同的语言意义和外观,就认为它们标准相等
        
        //ex:
        let e = "\u{E9}"
        let oe = "\u{65}\u{301}"
        
        if e == oe {
            print("same string")
        }
        
        let arrar = ["abc","abd","abe","bbc","bbd","bbe"]
        var sameprefix = 0
        var samesuff = 0
        
        for str in arrar{
            if str.hasPrefix("a"){
                sameprefix += 1 //md 不能用++ 来代表自加
            }else if str.hasSuffix("c"){
                samesuff += 1
            }
        }
        print("arr has \(sameprefix) sameprefix  , has \(samesuff) suff")
        
        //字符串的Unicode表示形式
        //每一个字符串中的小块编码都被称作代码单元,这些包括UTF-8编码格式(编码字符为8位的代码单元) UTF-16 UTF-32
        //其中 21位的Unicode 标量值集合,也是字符串的UTF-32编码格式
        
        //可以通过string 的 utf8属性来访问它的UTF-8表示 。
        //为 string.UTF8View  值为无符号8位(Uint8)的集合 每一个Uint8值都是一个字符UTF-8表示
        //使用为字符串.utf8
        
        let dogstr = "a little dog"
        for codeUint in dogstr.utf8{
            print("\(codeUint)",terminator:" ")
        }
        //输出为97 32 108 105 116 116 108 101 32 100 111 103
        //字母部分与ASCII表示相同
        
        for codeUint in dogstr.utf16{
            print("\(codeUint)",terminator:" ")
        }
       
        //Unicode的标量表示  通过string unicodescalars 来访问标量表示 其为UnicodeScalarView 类型属性,
        //UnicodeScalarView 为UnicodeScalar类型的集合
        let bigDog = "dog!!🐩"
        
        for scalar in bigDog.unicodeScalars{
            print(scalar.value,terminator:" ")// .value 就是.UInt32
        }
        
        //其实似懂非懂,主要还是想知道用在何处,键盘?火星文输入法?自定义字的组合?
        
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,192评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,858评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,517评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,148评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,162评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,905评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,537评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,439评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,956评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,083评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,218评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,899评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,565评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,093评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,201评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,539评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,215评论 2 358

推荐阅读更多精彩内容