iOS - Swift String 字符串

简介: 前言 public struct String public class NSString : NSObject, NSCopying, NSMutableCopying, NSSecureCodingSwift 语言主要使用 String 和 Character 来存储字符数据。

前言

    public struct String
    public class NSString : NSObject, NSCopying, NSMutableCopying, NSSecureCoding
  • Swift 语言主要使用 String 和 Character 来存储字符数据。String 是字符串类型,Character 是字符类型,一个或多个字符组成一个字符串。

  • String :

    • Swift 语言中的 String 类型与经典 Cocoa 或 Cocoa Touch 框架中的 Foundation NSString 类型进行了无缝衔接,Swift 语言中的 String 类型实现了 NSString 的大部分属性和方法,字符串搜索、拷贝、插入、删除等操作都有相应的 API 函数可以使用。

    • String 类型可以调用 NSString 类型的属性和方法,但是 NSString 类型不可以调用 String 类型独有的方法。并且以往框架中的任何要求使用 NSString 类型作为参数的函数,都可以使用 String 类型来替换,Swift 语言会自动将 String 类型转换为 NSString 类型。

    • Swift 语言中可以用 as 将 NSString 类型字符串转换为 String 类型。
      • 如:var str:String = (NSString(string: "beijing") as String)
    • Swift 语言中 String 类型声明为变量就可以被修改。而在 OC 中,需要通过选择 NSString 和 NSMutableString 来指定字符串是否可以被修改。

    • Swift 语言中不能直接将字符串当作字符数组那样通过使用下标访问指定字符。

    • Swift 语言支持字符串插值,你可以在长字符串中插入常量、变量、字面量和表达式,而不用经过特殊的转换,这使得创建用于展示、存储和打印的自定义字符串变的轻松自如。插入的值放在 “ ( ) ” 的括号中。
      • 如:let gameName = "2048"; print("hello my program name is \(gameName)")
    • Swift 语言使用值传递作为默认字符串拷贝方式,无论何时,传递的都是值的拷贝,当我们对 String 类型的变量或者常量进行赋值操作或当作函数/方法的参数传递时,这个变量或者常量的值会被拷贝,然后使用这个拷贝出的值进行赋值或者当作参数传递。

    • Swift 语言由于没有 length 属性,统计字符个数需要使用新的方法,在 Swift 2.2 中使用 characters.count 获取字符串中字符数量。NSString 的 length 属性在被 Swift 的 String 值访问时会被转换为 utf16count。所以 lrngth 属性是基于 UTF-16 表示的十六位 code units 数量,而不是基于 Unicode 字符,所以通过 count 返回的字符串数量并不总是与相同字符的 NSString 的 length 属性值相同。
      • 如:let str = "hello world"; print( str.characters.count )
  • Character :

    • 由于全面支持 Unicode 字符,每一个字符值代表一个 Unicode 字符,在 Swift 语言中表示字符使用 Character 类型。

    • Swift 语言声明字符时需要加上类型名称,否则会被推断为 String 类型。
      • 如:var doller:Character = "$"

1、字符串的输出

    let num:Int = 123
    
    // 直接输出 自动换行
    print(num)

    // 使用字符串插值输出 自动换行 输出常量或变量
    print("\(num)")

    // 使用强制类型转换输出 自动换行 输出常量或变量
    print(String(num))

    // 使用输出控制符输出 自动换行 且输出时间等信息 输出常量或变量
    NSLog("%d", num)

    // 使用字符串插值输出 自动换行 且输出时间等信息 输出常量或变量
    NSLog("\(num)")

    // 使用强制类型转换输出 自动换行 且输出时间等信息 输出常量或变量
    NSLog(String(num))

2、字符串的创建

    // String 型字符串的创建
        
        // 创建字符变量,必须指明为 Character 类型,否则会被自动推断为 String
        let str1:Character = "I"
    
        // 创建字符串变量,指明变量类型,未初始化
        let str2:String
    
        // 创建字符串变量,指明变量类型,并赋值
        let str3:String = "I Love China"
    
        // 创建字符串变量,未指明变量类型,自动推断为 String 类型
        let str4 = "Hello World"
    
        // 直接通过另一个字符串创建,与 str3 的地址不同,是值复制
        let str5:String = str3
    
    // NSString 型字符串的创建
        
        // 直接创建 NSString 类型字符串,未初始化
        let nsStr1:NSString
        let nsStr2:NSString = "123"
       
        // 由另一个 String 类型字符串创建
        let nsStr3 = NSString(string: str4)
    
        // 由另一个 NSString 类型字符串创建
        let nsStr4 = NSString(string: nsStr2)
    
        // 格式化创建 NSString 类型字符串
        let nsStr5 = NSString(format: "age is %d, score is %d", 18, 120)
    
        // 由 C 语言的字符串创建字符串
        let nsStr6:NSString? = NSString(CString: "bei jing nin hao", encoding: NSUTF8StringEncoding)
        let nsStr7:NSString? = NSString(UTF8String: "bei jing nin hao")
        
        // 从 文件 创建,try? 异常处理,若文件不存在或读取错误返回 nil
        let path = NSHomeDirectory() + "/Desktop/test.txt"
        let nsStr8:NSString? = try? NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding)
    
        // 从 Url 创建,try? 异常处理,若文件不存在或读取错误返回 nil
        let url = NSURL(fileURLWithPath: NSHomeDirectory() + "/Desktop/test.txt")
        let nsStr9:NSString? = try? NSString(contentsOfURL: url, encoding: NSUTF8StringEncoding)

3、字符串长度的计算

    // String 型字符串
    
        let str1:String = "zhou dong yu"
        
        // 计算字符串中字数长度,不是字符长度,代替 count(str1)
        let num1:Int = str1.characters.count
            
    // NSString 型字符串
    
        let str2:NSString = "hello world"
        
        // 计算字符串中字数长度,不是字符长度
        let num2:Int = str2.length

4、字符串位置的获取

    // String 型字符串
        
        let str:String = "bei jing ni hao"
            
        // 获取起始位置,即 0
        let startIndex = str.startIndex
    
        // 获取结束位置,指 字符串的结束字符 \0 的位置
        let endIndex = str.endIndex
    
        // 获取指定位置下标值,指从 str.startIndex 开始的第 n 个位置,代替 advance(str.startIndex, 2)
        let index = str.startIndex.advancedBy(2)
    
        // 获取下标区间值
        let range = str.startIndex.advancedBy(4)...str.startIndex.advancedBy(6)
    
        // 获取指定位置下标的 前一个值
        let predecessorIndex = str.startIndex.advancedBy(2).predecessor()
    
        // 获取指定位置下标的 后一个值
        let successorIndex = str.startIndex.advancedBy(2).successor()

5、字符串成员的引用(取字符)

    // String 型字符串
        
        let str1:String = "bei jing ni hao"
        
        // 取第5个字符
        let substr1:String = str1.substringWithRange(str1.startIndex.advancedBy(4)...str1.startIndex.advancedBy(4))
            
    // NSString 型字符串
    
        let str2:NSString = "bei jing ni hao"
        
        // 取第5个字符
        let substr2:unichar = str2.characterAtIndex(4)

6、字符串的连接

    // String 型字符串
    
        let str1:String = "bei "
        let str2:String  = "jing "
        
        // 使用 "+" 号连接两个字符串
        var str3:String = str1 + str2
        
        // 在字符串的末尾拼接字符串,代替 str3.extend("123456789")
        str3.write("123456789")
        
        // 参数和返回值都为 String 型
        let str4:String = str1.stringByAppendingString(str2)
        
        // 参数和返回值都为 String 型
        let str5:String = str1.stringByAppendingFormat(str2)
        let str6:String = str1.stringByAppendingFormat("%@", "jing huan ying ni")
        
    // NSString 型字符串
   
        let str7:NSString = "bei "
        let str8:NSString  = "jing "
       
        // 参数和返回值都为 String 型
        let str9:String = str7.stringByAppendingString((str8 as String))
        
        // 参数和返回值都为 NSString 型
        let str10:NSString = str7.stringByAppendingFormat(str8)
        let str11:NSString = str7.stringByAppendingFormat("%@", "jing huan ying ni")
        
        // NSMutableString 型字符串
        let str12:NSMutableString = "bei "
       
        // 追加
        str12.appendString("jing ")
    
        // 格式化追加
        str12.appendFormat("age is %d", 18)

7、字符串的比较

    // String 型字符串
        
        let str1:String = "bei jing"
        let str2:String = "BEI JING"
        
        // 判读两个字符串是否相等
        let bl1:Bool = str1 == str2
    
        // 判断字符串是否为空
        let bl2:Bool = str1.isEmpty
    
        // 判断字符串前缀
        let bl3:Bool = str1.hasPrefix("be")
    
        // 判断字符串后缀
        let bl4:Bool = str2.hasSuffix("ing")
    
        // 比较两个字符串
        let result1:NSComparisonResult = str1.compare(str2)
    
        // 忽略大小写比较
        let result2:NSComparisonResult = str1.caseInsensitiveCompare(str2)
        
    // NSString 型字符串
    
        let str3:NSString = "bei jing"
        let str4:NSString  = "BEI JING"
        
        // 判读两个字符串是否相等
        let bl5:Bool = str3 == str4
    
        // 判读两个字符串是否相等
        let bl6:Bool = str3.isEqual(str4)
    
        // 判读两个字符串是否相等
        let bl7:Bool = str3.isEqualToString(str4 as String)
    
        // 判断字符串前缀
        let bl8:Bool = str3.hasPrefix("be")
    
        // 判断字符串后缀
        let bl9:Bool = str3.hasSuffix("ing")
    
        // 忽略大小写比较
        let result3:NSComparisonResult = str3.compare(str4 as String)
        let result4:NSComparisonResult = str3.caseInsensitiveCompare(str4 as String)

8、字符串的大小写转换

    // String 或 NSString 型字符串 返回值都为 String 型
        
        let str1 = "bei JING"
        
        // 将字符串转换为大写
        let str2 = str1.uppercaseString
    
        // 将字符串转换为小写
        let str3 = str1.lowercaseString
    
        // 将字符串的单词首字母大写
        let str4 = str1.capitalizedString

9、字符串与数字的相互转换

    // String 型字符串
        
        // 字符 转 数字
        
            let char:Character = "A";
            
            var charVal1:Int = 0
           
            // 遍历字符转换为的字符串
            for charStr in String(char).unicodeScalars {
                
                // 将取出的字符转换为 Int 型数字
                charVal1 = Int(charStr.value)
            }
        
        // 字符串 转 数字
            
            // 数字型字符串 转 Int 型数字,代替 intStr.toInt()
            let intStr:String = "64";           let intVal1:Int? = Int(intStr)
                
            // 数字 转 字符
            let intVal2 = 65;                   let charVal2:Character = Character(UnicodeScalar(intVal2))

        // 数字 转 字符串
            
            // Int 型数字 转 字符串
            let intVal3:Int = 123;              let intStr1:String = intVal3.description
            
            // Int32 型数字 转 字符串
            let int32Val1:Int32 = 32;           let int32Str1:String = int32Val1.description
            
            // Int64 型数字 转 字符串
            let int64Val1:Int64 = 64;           let int64Str1:String = int64Val1.description
            
            // Float 型数字转 字符串
            let floatVal1:Float = 2.1;          let floatStr1:String = floatVal1.description
            
            // Double 型数字转 字符串
            let doubleVal1:Double = 162.1;      let doubleStr1:String = doubleVal1.description
            
            // Bool 型 转 字符串
            let boolVal1:Bool = true;           let boolStr1:String = boolVal1.description
        
    // NSString 型字符串
        
        // 字符串 转 数字
            
            // 字符串 转 Int 型数字
            let intVal4:Int = NSString(string: "6432").integerValue
    
            // 字符串 转 Int32 型数字
            let int32Val2:Int32 = NSString(string: "32").intValue
    
            // 字符串 转 Int64 型数字
            let int64Val2:Int64 = NSString(string: "64").longLongValue
    
            // 字符串 转 Float 型数字
            let floatVal2:Float = NSString(string: "2.1").floatValue
    
            // 字符串 转 Double 型数字
            let doubleVal2:Double = NSString(string: "162.1").doubleValue
    
            // 字符串 转 Bool 型
            let boolVal2:Bool = NSString(string: "false").boolValue

10、在字符串中查找子串的位置

    // NSString 型字符串
        
        let str1:NSString = "bei jing nin hao nin hao"
        let str2:String = "nin"
       
        // 顺序查找
            
            // 从前往后查找,找到第一个即停止查找
            let range1 = str1.rangeOfString(str2)
            
            // 或者 if(range1.length == 0), location 位置,length 长度
            range1.location == NSNotFound ? print("not found") : print(range1)
            
        // 条件查找
        /*
            CaseInsensitiveSearch = 1,               // “A”等同于“a”,不分大小写查找
            LiteralSearch = 2,                       // Unicode 的点对点比较。它只在所有字符都用相同的方式组成的情况下才会返回相等。
            BackwardsSearch = 4,                     // 在字符串的末尾开始反向搜索
            AnchoredSearch = 8,                      // 只考虑搜索的起始点(单独使用)或终止点(当与 NSBackwardsSearch 结合使用时)。
                                                     // 这个方法可以用来检查前缀或者后缀,以及大小写不敏感(case-insensitive)或者
                                                     // 音调不敏感(diacritic-insensitive)的比较。
                                                     
            NumericSearch = 64,                      // 它对字符串里的数字排序
             
            DiacriticInsensitiveSearch = 128,        // “A” 等同于 “Å” 等同于 “Ä.”
            WidthInsensitiveSearch = 256,            // 一些东亚文字(平假名和片假名)有全宽与半宽两种形式
            ForcedOrderingSearch = 512,
            RegularExpressionSearch = 1024           // 使用正则表达式搜索
        */
           
            // 从后往前查找,找到第一个即停止查找
            let range2 = str1.rangeOfString(str2, options: NSStringCompareOptions.BackwardsSearch)
           
            range2.location == NSNotFound ? print("not found") : print(range2)
           
        // 范围内查找
    
            // 在某个范围内查找
            let range3 = str1.rangeOfString(str2, 
                                    options: NSStringCompareOptions.CaseInsensitiveSearch, 
                                      range: NSMakeRange(8, 10))
           
            range3.location == NSNotFound ? print("not found") : print(range3)

11、字符串子串的提取(取子串)

    // String 型字符串
        
        let str1:String = "今天天气真不错,是风和日丽的,我们下午没有课,是心情也不错"
        
        // 从某个位置开始到结尾
        let str2:String = str1.substringFromIndex(str1.startIndex.advancedBy(8))
    
        // 从开始到某个位置
        let str3:String = str1.substringToIndex(str1.startIndex.advancedBy(18))
    
        // 某个范围内
        let str4:String = str1.substringWithRange(str1.startIndex.advancedBy(10)...str1.startIndex.advancedBy(15))
        
    // NSString 型字符串
    
        let str5:NSString = "今天天气真不错,是风和日丽的,我们下午没有课,是心情也不错"
        
        // 从某个位置开始到结尾
        let str6:String = str5.substringFromIndex(8)
    
        // 从开始到某个位置
        let str7:String = str5.substringToIndex(18)
    
        // 某个范围内
        let str8:String = str5.substringWithRange(NSMakeRange(10, 6))

12、字符串切割

    // String 型字符串
    
        let str1:String = "chen$chao$ni$hao$ma"
        let str2:String = "bei$jing#ni@hao&ma"
    
        // 字符串 按照字符 切割
        let arr1:Array = str1.componentsSeparatedByString("$")
    
        // 字符串 按照字符集 切割
        let arr2:Array = str2.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "$#@&"))
    
    // NSString 型字符串
        
        let str3:NSString = "chen$chao$ni$hao$ma"
        let str4:NSString = "bei$jing#ni@hao&ma"
        let str5:NSString = "Users/JHQ0228/Desktop"
        
        // 字符串 按照字符 切割
        let arr3:Array = str3.componentsSeparatedByString("$")
    
        // 字符串 按照字符集 切割
        let arr4:Array = str4.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "$#@&"))
    
        // 自动按照 "/" 分割字符串
        let arr5:Array = str5.pathComponents

13、字符串的插入

    // String 型字符串
    
        var str1:String = "bei jing ying ni "
        
        // 指定位置插入字符,str1.endIndex 字符串末尾位置
        str1.insert("!", atIndex: str1.endIndex)
    
        // 指定位置插入字符串,替代 str1.splice
        str1.insertContentsOf("huan ".characters, at: str1.startIndex.advancedBy(9))
    
    // NSMutableString 型字符串
        
        let str2:NSMutableString = "bei jing ying ni"
        
        // 指定位置插入字符串
        str2.insertString("huan ", atIndex: 9)
    
        // 重写全部字符串
        str2.setString("nan jing huan ying ni")

14、字符串的删除

    // String 型字符串
        
        var str1:String = "bei jing ren min huan ying nin !"
        
        // 指定位置删除字符 "!"
        str1.removeAtIndex(str1.endIndex.predecessor())
    
        // 指定范围删除字符串 "ren min "
        str1.removeRange(str1.startIndex.advancedBy(9)...str1.startIndex.advancedBy(16))
    
        // 删除全部字符串
        str1.removeAll(keepCapacity: true)
        
    // NSMutableString 型字符串
        
        let str2:NSMutableString = "bei jing ren min huan ying nin !"
        
        // 删除指定范围的字符串
        str2.deleteCharactersInRange(NSMakeRange(9, 8))

15、字符串的替换

    // String 型字符串
    
        var str1:String = "bei jing huan ying nin !"
            
        // 用字符替换指定位置的字符串
        str1.replaceRange(str1.startIndex...str1.startIndex.advancedBy(2), with: "I")
            
    // NSMutableString 型字符串
    
        var str2:NSMutableString = "bei jing huan ying nin !"
    
        // 替换指定位置的字符串
        str2.replaceCharactersInRange(NSMakeRange(9, str2.length - 9), withString: "ni hao")
    
        // 查找并替换指定的字符串
        str2.replaceOccurrencesOfString("in", 
                             withString: "IN", 
                                options: NSStringCompareOptions.LiteralSearch, 
                                  range: NSMakeRange(0, str2.length))
目录
相关文章
|
7天前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
16 2
|
13天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
35 9
|
12天前
|
索引 Python
String(字符串)
String(字符串)。
17 3
|
22天前
|
Swift iOS开发
Swift 字符串
10月更文挑战第26天
27 3
|
23天前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
41 1
|
27天前
|
安全 API Swift
探索iOS开发中的Swift语言之美
【10月更文挑战第23天】在数字时代的浪潮中,iOS开发如同一艘航船,而Swift语言则是推动这艘船前进的风帆。本文将带你领略Swift的独特魅力,从语法到设计哲学,再到实际应用案例,我们将一步步深入这个现代编程语言的世界。你将发现,Swift不仅仅是一种编程语言,它是苹果生态系统中的一个创新工具,它让iOS开发变得更加高效、安全和有趣。让我们一起启航,探索Swift的奥秘,感受编程的乐趣。
|
1月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
50 5
|
1月前
|
NoSQL Redis
Redis 字符串(String)
10月更文挑战第16天
39 4
|
1月前
|
canal 安全 索引
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
37 5
|
1月前
|
安全 Swift iOS开发
探索iOS开发中的Swift语言之美
在数字时代的浪潮中,移动应用已成为日常生活的延伸。本文将深入探讨iOS平台上的Swift编程语言,揭示其背后的设计哲学、语法特性以及如何利用Swift进行高效开发。我们将通过实际代码示例,展示Swift语言的强大功能和优雅简洁的编程风格,引导读者理解并运用Swift解决实际问题。