GVKun编程网logo

在Swift中对String调用NSString方法(swift string nsstring)

9

对于在Swift中对String调用NSString方法感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍swiftstringnsstring,并为您提供关于ios–如何将SwiftString

对于在Swift中对String调用NSString方法感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍swift string nsstring,并为您提供关于ios – 如何将Swift String连接到Objective C NSString?、NSString跟Swift String的区别和使用场景、Swift - String与NSString的区别,以及各自的使用场景、swift – 不能下标'[String:String]类型的值?’索引类型为’String’的有用信息。

本文目录一览:

在Swift中对String调用NSString方法(swift string nsstring)

在Swift中对String调用NSString方法(swift string nsstring)

苹果的Swift
文档指出

如果您正在Cocoa或Cocoa Touch中使用Foundation框架,则可以使用整个NSString API来调用您创建的任何String值

如果我有一个String对象,例如

var newString: String = "this is a string"

如何执行类似containsStringString var的NSString操作?

答案1

小编典典

经过一些研究,看起来containsString不是一个String函数,但是可以通过桥接到来访问NSString

在苹果公司关于将Swift与Cocoa和Objective-
C结合使用的文档中,它说

Swift会在String类型和NSString类之间自动桥接。这意味着在任何使用NSString对象的地方,都可以改用Swift
String类型,并从这两种类型中受益

但是看来,只有NSString的某些功能可以访问而无需显式桥接。要桥接到NSString并使用其任何功能,可以使用以下方法:

 //Example Swift String var    var newString:String = "this is a string"    //Bridging to NSString    //1    (newString as NSString).containsString("string")    //2    newString.bridgeToObjectiveC().containsString("string")    //3    NSString(string: newString).containsString("string")

所有这三个工作。有趣的是,只有某些NSString方法可用,Strings而其他方法则需要显式桥接。这可能是随着Swift的发展而建立的。

ios – 如何将Swift String连接到Objective C NSString?

ios – 如何将Swift String连接到Objective C NSString?

我吃疯狂药吗直接从文档中删除:

“Swift automatically bridges between the String type and the Nsstring class. This means that anywhere you use an Nsstring object,you can use a Swift String type instead and gain the benefits of both types—the String type’s interpolation and Swift-designed APIs and the Nsstring class’s broad functionality. For this reason,you should almost never need to use the Nsstring class directly in your own code. In fact,when Swift imports Objective-C APIs,it replaces all of the Nsstring types with String types. When your Objective-C code uses a Swift class,the importer replaces all of the String types with Nsstring in imported API.

要启用字符串桥接,只需导入基础“.

我做了这个…考虑:

import Foundation

var str = "Hello World"

var range = str.rangeOfString("e")

// returns error: String does not contain member named: rangeOfString()

然而:

var str = "Hello World" as Nsstring

var range = str.rangeOfString("e")

// returns correct (2,1)

我错过了什么吗?

解决方法

你已经有你的问题的答案.你错过了演员.写Swift代码时,这样一个语句
var str = "Hello World"

创建一个Swift字符串,而不是Nsstring.要使其作为Nsstring工作,您应该在使用之前使用as操作符将其转换为Nsstring.

这不同于调用在Objective-C中编写的方法,并提供一个String而不是一个Nsstring作为参数.

NSString跟Swift String的区别和使用场景

NSString跟Swift String的区别和使用场景

当下Swift项目已经越来越多,可能会经常见到 str as Nsstring 或者str as String字符串在这两者之间的来回切换,因为有些操作用OC字符串比较方便,而有些操作则相反,熟练掌握这两种字符串的特点对项目的开发必然有利。本文是一些自己的理解,借鉴了官方文档,如有理解偏差之处也欢迎指点。

Nsstring和String的共同点

首先说下共同点,就是String保留了大部分Nsstring的api比如
.hasPrefix
.lowercaseString
.componentsSeparatedByString
.substringWithRange 等等
所以很多常规操作在开发中使用两者之一都是可以的,

Nsstring和String的共同点的区别

1.Nsstring引用类型Swift String值类型

var nsstring: Nsstring = Nsstring()
  var swiftString:String = String()        
  var nsstring: Nsstring = "dsx"
  var swiftString:String = "dsx"

两者都可以使用自己的类名来直接进行初始化,下面的方法也是初始化,虽然写法相同,但是Nsstring的意思是初始化了一个指针指向了这个字符串,但Swift String的意思则是把字符串字面量赋值给变量。

2. Swift String字符串之间的拼接比Nsstring方便

2.1 Nsstring需要用append或者stringWithFormat将两个字符串拼接

Nsstring *strA = @"My name";
 Nsstring *strB = @" is dsx";
 strA = [strA stringByAppendingString: strB];

2.2 而Swift String只需要用 + 即可

var strA = "My name"
 var strB = " is dsx"
 strA = "My name" + " is dsx"
 strA = strA + strB
 println(strA)

在swift最开始的语法是允许字符串和字符之间 直接使用 “+” 拼接的,但是swift1.2以后就不能这么做了,字符串与字符直接只能用append衔接了。

2.3 Swift String 可以实现字符串遍历

SwiftString 可以实现遍历输出一个字符串内部的所有字符,这是Nsstring所做不到的,因为前者继承了CollectionType协议(swift2后不再继承此协议,改成通过一个characters属性来提供一个字符的集合)

 // swift1.2
  for charater in "My name is dsx" {
  println(charater)
 }
 // swift2.0
for character in "My name is dsx".characters {
  print(character)
}

swift的字符串更像是多个字符元素组合而成有序列的一个产物,像但不是集合类;如果把上面的“This is a book” 后面加上 as Nsstring 则会报如下错误:
Type 'Nsstring' does not conform to protocol 'SequenceType'

在swift2.0以后写as String 也会报上面错误,2.0将原来String继承的SequenceType和CollectionType协议都下沉到了String.CharacterView来继承,感觉苹果这么做的目的是为了减少资源浪费。

2.4 Swift String计算字符串长度的方法与Nsstring不同

var strA: String   = "mc梦"
 var strB: Nsstring = "mc梦"
 print(strA.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)) // 5
 print(strA.characters.count)) // 3
 print(strB.length); // 3

Nsstring直接使用 字符串.length 就可以获得字符串的长度,但是String敲.length只能敲出 .lengthOfBytesUsingEncoding(NSUTF8StringEncoding) 这么算汉字的存储空间就是英文的3倍。 swift真正的类似于.length的方法就是取出characters属性(数组)然后.count

2.5 Swift String比较字符串相等的方式与Nsstring不同

let strA: Nsstring = ""
let strB: Nsstring = ""
let strC: Nsstring = "dsx"
let strD: Nsstring = "dsx"

// Nsstring 字符串相等
if(strA.isEqualToString(strB as String)){
  print("yes");
}

// String的相等 
if (strC == strD){
  print("yes");
}

Nsstring 有一个方法isEqualToString 方法用来判断两个字符串是否完全相等,String没有这个方法,但是因为String是值类型所以可以直接用 == 判断是否完全相等。

2.6 Nsstring可以同基本数据类型见转化

var strA: Nsstring = "12306"
var strB: Nsstring = "0.618"  
var numOfInt       = strA.integerValue;
var numOfDouble    = strB.doubleValue;

这个功能Swift没有,所以在json解析或字典转模型时可能会使用Nsstring比较方便。

Swift String可以通过isEmpty属性来判断该字符串是否为空

var emptyStr = ""
if emptyStr.isEmpty {  // Nsstring没有判断空的方法
    print("It is empty")
}

这个也是swift String独有的一个属性。一般Nsstring想判断字符串是否为空都是需要看.length是否>0。 判断Nsstring == nil 这个方法现在已经不让用了,会报错
Binary operator ‘==’ cannot be applied to operands of type ‘Nsstring’ and ‘NilLiteralConvertible’

2.7 Swift String独有的字符串插入字符功能

var strA:String = "My name is dx"
strA.insert("s",atIndex: strA.characters.indexOf("x")!);
print(strA) // My name is dsx

这个方法仅仅可以插入单个字符不能插字符串,如果里面写成ss 就会报错Cannot convert value of type 'String' to expected argument type 'Character'
如果你不是在董铂然博客园看到本文,请点击查看原文。
Nsstring是一个指针不能进行此操作。并且String也拥有Nsstring的subStringFromIndex 或 ToIndex的功能。

总结:

String的总体功能来看还是比Nsstring要更加强大,毕竟Swift语法里的正规军。两者有很多的不同,甚至他有你没有的功能说到底都是一个是值类型,一个是引用类型引起的。swift2.0之后扩展了一些属性,这也让String的很多方法的调用方式发生了巨大改变。 还有一些不同正在探索中,希望本文能对读者有所帮助,转载必须注明转载和原文链接。

Swift - String与NSString的区别,以及各自的使用场景

Swift - String与NSString的区别,以及各自的使用场景

String是Swift里新增加的类型,它与原来的Nsstring可以很方便地互相转换。但在实际开发中,我们该如何选择?

1,能使用String类型就尽量使用String类型,原因如下:
(1)现在Cocoa里所有的API都能接受和返回String类型,所以也没必要特地转换下。
(2)Swift的String是struct,而Nsstring类是NSObject,所以String更符合字符串“不变”这一特性。同时,在不触及Nsstring特有操作和动态特性的时候,使用String的方法,在性能上也会有所提升。
(3)由于String实现了像CollectionType这样的接口,所以有些Swift的语法特性只有String才能使用,而Nsstring却没有。
比如for...in的枚举遍历所有字符
1
2
3
4
let words = "Hangge.com"
for i in words{
print (i) //Hangge.com
}

2,要使用Nsstring的情况

(1)String有hasPrefix/hasSuffix方法用来判断是否以某字符串开头或结尾,但却没有containsstring方法判断内部是否包含另一个字符串。但这个方法Nsstring却有,所有我们只能先将String转换成Nsstring。
1
2
3
4
let words = "Hangge.com"
if (words as Nsstring ).containsstring( "ge" ){
print ( "Yes" ) //YES
}
或者使用String的rangeOfString方法来判断是否包含这个字符串:
words.rangeOfString("co") !=nil{
}

(2)String与Range配合比较麻烦,比如下面截取字符串的一部分,分别用转换成Nsstring再截取和直接使用String截取做演示,大家可以自行比较。(这个也只是麻烦些,其实问题也不大)
4
5
6
7
8
//先转换成Nsstring
rangeStr1 = (words ).substringWithRange( NSMakeRange (4,2)) //ge
//不转换
index = words.startIndex.advancedBy(4)
index2 = words.startIndex.advancedBy(6)
range = Range < String . Index >(start: index,end: index2)
rangeStr2 = words.substringWithRange(range) //ge

原文出自: www.hangge.com 转载请保留原文链接: http://www.hangge.com/blog/cache/detail_798.html

swift – 不能下标'[String:String]类型的值?’索引类型为’String’

swift – 不能下标'[String:String]类型的值?’索引类型为’String’

let orch = NSUserDefaults().dictionaryForKey("orch_array")?[orchId] as? [String:String]
   orch[appleId]

orch [appleId]行上的错误:

Cannot subscript a value of type ‘[String : String]?’ with an index
of type ‘String’

为什么?

问题2:

let orch = NSUserDefaults().dictionaryForKey("orch_array")?[orchId] as! [String:[String:String]]
   orch[appleId] = ["type":"fuji"]

错误:“无法分配此表达式的结果”

该错误是因为您尝试在可选值上使用下标.您正在转换为[String:String],但您正在使用转换运算符的条件形式(作为?).从文档:

This form of the operator will always return an optional value,and the value will be nil if the downcast was not possible. This enables you to check for a successful downcast.

因此,orch的类型为[String:String]?.要解决这个问题,您需要:

用作!如果你肯定知道返回的类型是[String:String]:

// You should check to see if a value exists for `orch_array` first.
if let dict: AnyObject = NSUserDefaults().dictionaryForKey("orch_array")?[orchId] {
    // Then force downcast.
    let orch = dict as! [String: String]
    orch[appleId] // No error
}

2.使用可选绑定检查orch是否为零:

if let orch = NSUserDefaults().dictionaryForKey("orch_array")?[orchId] as? [String: String] {
    orch[appleId] // No error
}

希望有所帮助.

今天的关于在Swift中对String调用NSString方法swift string nsstring的分享已经结束,谢谢您的关注,如果想了解更多关于ios – 如何将Swift String连接到Objective C NSString?、NSString跟Swift String的区别和使用场景、Swift - String与NSString的区别,以及各自的使用场景、swift – 不能下标'[String:String]类型的值?’索引类型为’String’的相关知识,请在本站进行查询。

本文标签: