swift 字符串

下面是一些swift字符串的一些用法, 包括 从字符串的创建, 字符串的增删改查基本操作,字符串比较, 字符串的各种判断, 再到获取某个字符串中的某个字符, 对字符串进行转码, 从控制台输入字符串 等等, 你想要的都在这(欢迎大家补充),废话不多说了, 下面是代码, 代码的注释已经很清楚了

//
//  main.swift
//  StringPra
//
//  Created by 刘瑞龙 on 15/8/27.
//  Copyright © 2015年 V1. All rights reserved.
//

import Foundation

/*
编程环境为xcode 7.0 beta 版
*/

/*--------------------(1)定义一个字符串--------------------------*/

//变量字符串, 字符串的值可以随意更改, 可赋初始值也可不赋, 不赋初始值直接使用, 编译都不会通过
var str1_1:String

//类型推断, 当直接赋值的时候, 可以不指名类型, 编译器会进行类型推断, 把 str1Test 定义为String 类型
var str1_2 = "123"

//常量字符串, 我这个版本可以不进行初始化, 可以使用时再初始化, 并且只能初始化一次, 不能再更改, 赋值时会有类型推断, 所以这里不用写类型了
let str1_3:String


/*--------------------(2)在String中的转义字符--------------------------*/

/*

\0    空字符

\\    反斜杠

\t    制表符

\n    换行符

\r    回车符

\”    双引号

\’    单引号

*/

//转义字符的用法
print("\"我的两边应该有双引号\"")
/*
打印结果:  "我的两边应该有双引号"
*/


/*--------------------(3)   /() 的用法--------------------------*/

//在OC中会有 NSString * str = [NSString stringWithFormat:@"%@%d", string, i]; 的用法
//C语言中有这样的用法 printf("%d", i);

//在swift 不在使用这样的转换字符, 而是用 /() 来拼接或者打印字符串  eg:

var str3_1 = "我今年\(99)岁了"
print(str3_1)    //对于字符串, 可以直接这么打印
/*
输出结果: 我今年99岁了
*/

var int1 = 10
print("我有\(int1)个苹果")
/*
输出结果: 我有10个苹果
*/


/*--------------------(4) 字符串的拼接--------------------------*/
/*
NSString * str = [NSString stringWithFormat:@"%@%d", string, i];
OC中的拼接字符串的方法,比较麻烦 swift 可以直接使用 + +=  这些符号直接进行拼接:
eg:
*/

let str4_1 = "123"
let str4_2 = "456"
let str4_3 = str4_1 + str4_2
print(str4_3)
/*
输出结果: 123456
*/

//对于可变字符串
var str4_4 = "hello"
let str4_5 = "world"
str4_4 += str4_5
print(str4_4)
/*
输出结果: helloworld
*/

//可能有人试图用类似于OC的字符串拼接方式进行拼接, 但发现括号里填的不是string 类型, 而是这两个类型, 对于这两个拼接方法一会儿会讲到
/*
str4_4.append(<#T##c: Character##Character#>)
str4_4.append(<#T##x: UnicodeScalar##UnicodeScalar#>)
*/


/*--------------------(5)字符串的比较--------------------------*/

/*
字符串的比较可以直接使用, 逻辑运算符号 >  >= < <= ==进行比较, 比较的标准, 就是从字符串的每一个元素开始, 比较ascii 值, 如果相同就继续向下比较, 知道比出大小 或者 相等
*/
let str5_1 = "abcdefg"
let str5_2 = "abcz"
if str5_2 > str5_1 {
    print("str5_2 比 str5_1 大")
    /*
    输出结果: str5_2 比 str5_1 大
    */
}
//其他几个逻辑运算符同理

/*
同时, OC的compare 比较方法同样适用
OC中:
[str1 compare str2]    返回值类型是NSComparisonResult其实这是一个枚举 有三个值, NSOrderdAscending  -1  升序, NSOrderdSame 0  相等, NSOrderdDescending
不区分大小写的比较:
[str1 caseInsensitiveCompare: str2];
结果形式同上
swift 代码如下:
*/

let str5_3 = "abcdefg"
let str5_4 = "abcz"
let resutlt: NSComparisonResult = str5_3.compare(str5_4)   //返回值为 NSComparisonResult 枚举类型
switch resutlt {
case .OrderedAscending:
    print("str5_3 小于 str5_4")
case .OrderedSame:
    print("str5_3 等于 str5_4")
case .OrderedDescending:
    print("str5_3 大于 str5_4")
}
/*
输出结果: str5_3 小于 str5_4
*/

//使用这个不区分大小写的比较也是一样的
str5_3.caseInsensitiveCompare(str5_4)


/*
str5_3.compare(<#T##aString: String##String#>, options: <#T##NSStringCompareOptions#>, range: <#T##Range<Index>?#>, locale: <#T##NSLocale?#>)
这个方法也和OC总类似, 第二个参数 比较规则(从前到后, 还是从后到前, 不分大小写, 区分大小写 等等), 第三个参数是确定比较位置, 第四个是填本地信息的,直接填nil就行;
值得注意的是 第三个参数, 所填的range 是第一个用前面的字符串的这个range的字符串和后者整个字符串相比, 比如, 你用ABCD 和 ABC 相比较, 如果设置range 为(0, 1) 那么你是用 A 和 ABC相比, 而不是A与A相比较
eg:
*/
let str5_5 = "abcab"
let str5_6 = "abczz"
let range = Range(start: advance(str5_5.startIndex, 3), end: advance(str5_5.endIndex, 0))
let str = str5_5.substringWithRange(range)
print("str == \(str)")
let options: NSStringCompareOptions = .LiteralSearch
let optionResult: NSComparisonResult = str5_5.compare(str5_6, options: options, range: range, locale: nil)
//range 为比较str5_5 第3个字符到最好一个字符也就是"ab", 和 整个 str5_6 比较, 所以 str_5 小于 str_6
switch optionResult {
case .OrderedAscending:
    print("str5_5 小于 str5_6")
case .OrderedSame:
    print("str5_5 等于 str5_6")
case .OrderedDescending:
    print("str5_5 大于 str5_6")
}
/*
打印结果: str5_5 小于 str5_6
*/



/*--------------------(6)字符串大小写的转换--------------------------*/
//swift 使用Unicode编码, Unicode 编码 整合了 世界上大部分语言以及emoji表情, 在网站上显示为 ?? 的部分就是emoji表情, 但是在swift中是正常识别的

let str6_1 = "a��bcDEfg哈哈哈123"
print(str6_1.lowercaseString)
let str6_2 = str6_1.uppercaseString
print(str6_2)
/*
输出结果:  a��bcdefg哈哈哈123
          A��BCDEFG哈哈哈123
*/
/*根据例子结果可以看出来, 这两个方法是对字符串中字母进行处理, 其他的不变:
uppercaseString : 将全部字母变为大写
lowercaseString : 将全部字母变为小写
而且都是重写生成了一个字符串, 而不是在原有字符串进行变化
*/


/*------------(7)判断字符串是否为空 & 判断是否某个前缀 后缀----------*/
let str7_1 = ""
if str7_1.isEmpty {
    print("str7_1  is Empty")
    /*
    输出结果: str7_1  is Empty
    */
}

let str7_2 = "www.v1.cn"
if str7_2.hasPrefix("www") {
    print("str7_2 有前缀 www")
    /*
    输出结果: str7_2 有前缀 www
    */
}
if str7_2.hasSuffix("cn") {
    print("str7_2 有后缀 cn")
    /*
    输出结果: str7_2 有后缀 cn
    */
}


/*--------------------(8)获取字符串的子串--------------------------------*/

let str8_1 = "hello world"
/*
这三个, 后两个就不多说了, 只要会创建index就知道怎么回事了, 下面说下第一个
substringWithRange(<#T##aRange: Range<Index>##Range<Index>#>)
substringFromIndex(<#T##index: Index##Index#>)
substringToIndex(<#T##index: Index##Index#>)
*/
let indexStart = advance(str8_1.startIndex, 0)  //index 的创建方式
let indexEnd = advance(str8_1.startIndex, 5)
let range8_1 = Range(start: indexStart, end: indexEnd) //range的创建方式
let str8_2 = str8_1[range8_1]        //由于String 实现了 subscript 可以通过[]里填range 的方式 获取子串, 也可以通过填Index来过去character
print("str8_2 == \(str8_2)")
/*
输出结果: str8_2 == hello
*/


/*--------------------(9)获取字符串中character--------------------------*/
//swift 使用Unicode编码, Unicode 编码 整合了 世界上大部分语言以及emoji表情, 在网站上显示为 ?? 的部分就是emoji表情, 但是在swift中是正常识别的

//for in 遍历获取每一个character
let str9_1 = "��ab呵呵"
for char in str8_1.characters {
    print(char)
    /*
    输出结果:
    ��
    a
    b
    呵
    呵
    */
}

//获取某一个character,因为String 类型 实现了subscript, 所以可以通过str[] 中括号中填 index 的方式来获取某个index, 下面来获取str9_1 的第一个字符
let index9_1 = advance(str9_1.startIndex, 0)
let char = str9_1[index9_1]
print("char == \(char)")
/*
输出结果: char == ��
*/


/*--------------------(10)替换字符串中某一段字符--------------------------*/
/*
//知道怎么创建range, 应该就会知道怎么用这个了, 一个用character替换range内的字符串, 一个是用String来替换range内的字符串, 下面说一下用字符串替换的
replaceRange(<#T##subRange: Range<Index>##Range<Index>#>, with: <#T##C#>)
replaceRange(<#T##subRange: Range<Index>##Range<Index>#>, with: <#T##String#>)
*/
//定义一个字符串--变量
var str10_1 = "123 world"
let str10_2 = "hello"
let range10_1 = Range(start: advance(str10_1.startIndex, 0), end: advance(str10_1.startIndex, 3))
str10_1.replaceRange(range10_1, with: str10_2)
print("str10_2 == \(str10_1)")
/*
输出结果: str10_2 == hello world
*/



/*--------(11)获取字符串中ascii表字符的int值, 并将Int转换成character 和 字符串------*/

//创建一个只含有, ascii表字符的字符串
let str11_1 = "abc"
var intStr = ""
for char11_1 in str11_1.characters {
    var tempInt: Int = 0
    for i in String(char11_1).utf8{
        tempInt = Int(i)
    }
    print(tempInt)
    /*
    输出结果: 
    97
    98
    99
    */
    intStr += String(tempInt) + "--"    //将Int类型转成String类型并且拼接
}
print("intStr == \(intStr)")
/*
输出结果 intStr == 97--98--99--
*/

//将整形转化为 character 类型 最终转化为 String 类型
let int_11_1 = 97
let char11_1: Character = Character(UnicodeScalar(int_11_1))
print("the character char11_1 is \(char11_1)")
/*
输出结果: the character char11_1 is a
*/

let str11_2 = String(char11_1)
print("the string: str11_2 is \(str11_2)")
/*
输出结果: the string: str11_2 is a
*/

/*--------(12)对swift字符串与utf8字符串进行互转------*/
/*
有些时候, 特别是从服务器发送post请求, 需要对汉语字符串进行处理, swift对字符串转码同样使用的是 OC 中的方法
*/
let str12_1 = "我是你龙哥"
let str12_2 = str12_1.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
print("str12_2 = \(str12_2!)")
/*
输出结果: str12_2 = %E6%88%91%E6%98%AF%E4%BD%A0%E9%BE%99%E5%93%A5
*/

let str12_3 = str12_2?.stringByReplacingPercentEscapesUsingEncoding(NSUTF8StringEncoding);
print("str12_3 = \(str12_3!)")
/*
输出结果: str12_3 = 我是你龙哥
*/


/*--------(13)通过scanf 在swift语言中输入字符------*/

要从控制台输入字符串, 首先要说一下怎样和C混编, 首先先建一个C文件, 这时xcode 会提示你是否创建桥接文件, 点 creat bridging header(当然自己建也可以, 如何建等我在发博客会说)
桥接C文件
创建完了就可以在C文件中写这个方法

//
//  SwiftScanf.c
//  StringPra
//
//  Created by 刘瑞龙 on 15/8/27.
//  Copyright © 2015年 V1. All rights reserved.
//

#include <stdio.h>

void swiftScanf(char * inputStr){
    scanf("%s", inputStr);
}

然后在桥接文件中导入这个头文件:
桥接文件

接下来就可以在swft中调用这个方法了, 具体向上边写的那样, 这里在写一遍:

/*--------(13)通过scanf 在swift语言中输入字符------*/

var char13_1 = UnsafeMutablePointer<CChar>.alloc(20)  //这个方法生成了一个与C中的字符指针相通的类型
swiftScanf(char13_1)    //这是桥接过来的C方法
/*
C方法实现如下:

void swiftScanf(char * inputStr){
    scanf("%s", inputStr);
}
*/
let str13_1 = String.fromCString(char13_1)  //将字符指针(即C中的字符串)转化成swift字符串
print("输入的字符为: \(str13_1!)")
/*
输入:     thisisainputchar
输出结果: thisisainputchar
*/

输入输出结果

说明: 还有一些OC中的方法都可以在swift中用了, 只要有OC基础, 那些就都可以知道怎么用了

下面还有我用来练习字符串的练习题, 大家有兴趣可以练习下

/*--------------------------------------------------------------------*/

/*-----------------下面是我给字符串添加的一些用来练习的方法------------------*/
extension String{

    //给变量字符串添加方法, 进行ascii值从小到大排序
    mutating func sortString(){
        for var i = 1; i < self.characters.count; ++i{
            for var j = 0; j < self.characters.count - i; ++j{
                let range1 = Range(start: advance(self.startIndex, j), end: advance(self.startIndex, j + 1))
                let str1 = self.substringWithRange(range1)
                let range2 = Range(start: advance(self.startIndex, j + 1), end: advance(self.startIndex, j + 2))
                let str2 = self.substringWithRange(range2)
                if str1 > str2 {
                    self.replaceRange(range1, with: str2)
                    self.replaceRange(range2, with: str1)
                }
            }
        }
    }

    //添加类方法, 传入一个字符串,根据这个字符串生成一个ascii值从小到大排序的字符串
    static func sortStr(var str: String) -> String{
        for var i = 1; i < str.characters.count; ++i{
            for var j = 0; j < str.characters.count - i; ++j{
                let range1 = Range(start: advance(str.startIndex, j), end: advance(str.startIndex, j + 1))
                let str1 = str[range1]
                let range2 = Range(start: advance(str.startIndex, j + 1), end: advance(str.startIndex, j + 2))
                let str2 = str.substringWithRange(range2)
                if str1 > str2 {
                    str.replaceRange(range1, with: str2)
                    str.replaceRange(range2, with: str1)
                }
            }
        }
        return str
    }

    //扩展一个类方法, 传入一个字符串, 根据传入字符串生成一个逆序的字符串
    static func inverseStr(str: String) -> String{
        var string = ""
        for var i = 0; i < str.characters.count; ++i {
            let index = advance(str.endIndex, -(i + 1))
            string += String(str[index])
        }
        return string
    }

    //扩展一个类方法, 传入一个只含有字母的字符串, 根据传入字符串生成一个大小写字母翻转的字符串
    static func overStr(str: String) -> String {
        var string = ""
        for var i = 0; i < str.characters.count; ++i{
            let range = Range(start: advance(str.startIndex, i), end: advance(str.startIndex, i + 1))
            let subStr = str.substringWithRange(range)
            if subStr == subStr.lowercaseString {
                string += subStr.uppercaseString
            } else if subStr == subStr.uppercaseString {
                string += subStr.lowercaseString
            }else {
                string += subStr
            }
        }
        return string
    }

    //将字符串 翻转后 ascii 值 + 10
    static func encryptCode(code: String) -> String{
        var tempStr = ""
        for var i = 0; i < code.characters.count; ++i {
            let index = advance(code.startIndex, code.characters.count - i - 1)
            var cha: Character = code[index]
            var tempInt: Int = 0
            for j in String(cha).utf8{
                tempInt = Int(j) + 10
            }
            cha = Character(UnicodeScalar(tempInt))
            tempStr += "\(cha)"
        }
        print("\(tempStr)")
        return tempStr
    }

}

欢迎大家补充

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值