Swift2.0 中的String(五):String和NS-XXX系列的互相转换

Swift中的字符串,第五篇,常用NS-XXX系列的类型转换。其他的几篇传送门:

刚开始碰String的时候着实被各种繁琐的操作折腾得不轻,不能随便取字串、比较、赋值,不能获得实际编码值……往往想干点什么,一搜,就是NSString,NSData的API,晕头转向。研究了一阵子编码,慢慢也摸清了这些数据类型和它们的方法,简单总结一下互相转换的方法,给新手一点方向。这篇文章里的类型包括了String, NSString, NSURL, NSData这几种,String是Swift的字符串类型不用多讲,封装得很豪华但各种概念多用起来有点麻烦;NSString是OC里面的字符串,但有很多实用且方便的API;NSData其实属于无差别的Data类型,存储字符串的话是RawData,有点像C语言里面的string,其实是数据块;NSURL专门用来表示网络地址,有一些网络相关API。

你看到的是非授权版本!爬虫凶猛,请尊重知识产权!

转载请注明出处:http://conanwhf.github.io/2015/12/08/Swift_String_5/

访问原文「Swift2.0 中的String(五):String和NS-XXX系列的互相转换」获取最佳阅读体验并参与讨论

一些主要的操作其实在(四)编码转换 中特别是手动编码转换那一节实现过,这里更多的是总结。首先定义几个变量:

var str = “测试”
var data :NSData?
var nstr : NSString?
var url : NSURL?

NSString和String的转换

NSString和String就是兄弟,可以简单地直接赋值或者强制类型转换:

nstr = str
str = String(nstr)

NSURL和其他类型的转换

从String到NSURL使用初始化函数即可,但NSURL由于是网络传递用字符串,编码使用UTF8,如果原始地址String中有中文字符,直接转换会返回nil,所以需要先将String转换一下编码。而对于NSString,则可以简单地强制换为String操作。

let utf8str = str.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())!
nstr = utf8str
url = NSURL(string: utf8str)
url = NSURL(string: String(nstr!))

NSURL转换成String或NSString也是使用相应的初始化函数(不考虑编码)

str = String(url!)
nstr = NSString(string: url!.absoluteString)

NSData和其他类型的转换

理论上来说NSData可以是任何数据,有时候我们需要其数据层面的操作API,又需要解读数据里面的文本,那么需要将NSData转换为其他类型。将字符串转换成Data的接口都是同一个dataUsingEncoding,记得不要弄错编码,编码不同会改变数据。

data = str.dataUsingEncoding(NSUTF8StringEncoding)
data = nstr?.dataUsingEncoding(NSUTF8StringEncoding)
data = url?.absoluteString.dataUsingEncoding(NSUTF8StringEncoding)

而有时候我们需要自己填充数据,再转换为字符串,这种时候以填充Ascii码值比较多,毕竟汉字和Unicode的编码规则比较复杂,不过也是可以用的:

let byte :[UInt8]    = [0xe4, 0x8d, 0xa9, 0x20, 0xe3, 0x8e, 0x8f]
data                 = NSData(bytes: byte, length: byte.count)
str = String(data: data!, encoding: NSUTF8StringEncoding)!
nstr = NSString(data: data!, encoding: NSUTF8StringEncoding)
url                 = NSURL(dataRepresentation: data!, relativeToURL: nil)

上面的做法是先将一个Uint8数组填充好,转化为NSData,然后再变成需要的字符串。