在Swift中,如何检查一个对象(AnyObject)是否为字符串?

11

尝试使用:

obj.isKindOfClass(String)

但是它说类型“String”不符合协议“AnyObject”

那么你如何判断一个对象是否为字符串?

这个问题的背景是UIActivity方法prepareWithActivityItems中,我需要保存活动项目,但如果有多个活动项目,如何确定每个项目的内容?

2个回答

23

检查:

obj is String // true or false

转换:

obj as? String // nil if failed to convert

可选绑定:

if let str = obj as? String {
    // success
} else {
    // fail
}

那很容易。文档中就有。哎呀。https://developer.apple.com/library/ios/documentation/swift/conceptual/swift_programming_language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-XID_513 - shim

4

我会稍微离题一下,让你理解正在发生的事情。

在Swift中,字符串不是对象。 !!!

有点。 ???

由于桥接方式的工作原理...如果您导入Objective-C运行时,则可以将字符串视为对象...请看这个:

这段代码根本无法编译:

// Playground - noun: a place where people can play

// import Foundation

var foo: AnyObject = "hello"
                     ^ Type 'String' does not conform to protocol 'AnyObject'

如果我取消注释Foundation框架,那么它就可以完美编译了,因为我们激活了String和NSString之间的桥接。
// Playground - noun: a place where people can play

import Foundation

var foo: AnyObject = "hello" // We're all good here!

如果你想检查foo是否是一个字符串...可以这样做:

import Foundation

var foo: AnyObject = "hello"

foo.isKindOfClass(NSString) // this returns true

所以,字符串不是对象,但如果你将其视为对象,则会转换为NSString,现在它就是一个对象。但是你无法检查对象是否属于String类,因为没有这样的String对象。你必须使用NSString
当然,你仍然应该像Scott在他的答案中所说的那样,使用isas? 关键字。

感谢您详细的回复。 - shim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接