是否有一个函数来确定Swift中的变量类型?我认为type()在Python中可能会有类似的东西.
我想要一种判断变量是否是Swift中的Foundation对象或C变量的方法.像NSString vs String,或NSArray vs array.这样我就可以在控制台中将其注销,并清楚地看到它是什么.
例如,我想知道array下面第一个推断的类型:
var array = [1,2,3] // by default NSArray or array?
var array:[Int] = [1,2,3]
var array:NSArray = [1,2,3]
var array:Array<Any> = [1,2,3]
Run Code Online (Sandbox Code Playgroud)
我已经看到了判断一个给定变量在这个问题中是否是一种给定类型的答案,但我会说它与我想要的有很大不同.
小智 26
您可以使用该.dynamicType属性获取对值的类型对象的引用.这相当于Python的type()函数,并在语言参考:类型:元类型类型下的Swift文档中提到.
var intArray = [1, 2, 3]
let typeOfArray = intArray.dynamicType
Run Code Online (Sandbox Code Playgroud)
使用此类型对象,我们可以创建相同数组类型的新实例.
var newArray = typeOfArray()
newArray.append(5)
newArray.append(6)
println(newArray)
Run Code Online (Sandbox Code Playgroud)
[5, 6]
Run Code Online (Sandbox Code Playgroud)
我们可以[Int]通过尝试附加一个float 来看到这个新值是相同的类型():
newArray.append(1.5)
Run Code Online (Sandbox Code Playgroud)
error: type 'Int' does not conform to protocol 'FloatLiteralConvertible'
Run Code Online (Sandbox Code Playgroud)
如果我们导入Cocoa并使用具有混合类型的数组文字,我们可以看到NSArray创建了一个:
import Cocoa
var mixedArray = [1, "2"]
let mixedArrayType = mixedArray.dynamicType
var newArray = mixedArrayType()
var mutableArray = newArray.mutableCopy() as NSMutableArray
mutableArray.addObject(1)
mutableArray.addObject(1.5)
mutableArray.addObject("2")
println(mutableArray)
Run Code Online (Sandbox Code Playgroud)
(1, "1.5", 2)
Run Code Online (Sandbox Code Playgroud)
但是,此时似乎没有任何通用的方法来生成类型对象的字符串描述,因此这可能无法满足您所询问的调试角色.
派生的类型NSObject确实有一个.description()方法,就像在SiLo的答案中所使用的那样,
println(mixedArrayType.description())
Run Code Online (Sandbox Code Playgroud)
__NSArrayI
Run Code Online (Sandbox Code Playgroud)
但是,在Swift的内置数组等类型中不存在这种情况.
println(typeOfArray.description())
Run Code Online (Sandbox Code Playgroud)
error: '[Int].Type' does not have a member named 'description'
Run Code Online (Sandbox Code Playgroud)
Eri*_*rik 10
有可能这样做,虽然它不一定简单也没有用:
func getClassName(obj : AnyObject) -> String
{
let objectClass : AnyClass! = object_getClass(obj)
let className = objectClass.description()
return className
}
let swiftArray = [1, 2, 3]
let swiftDictionary = ["Name": "John Doe"]
let cocoaArray : NSArray = [10, 20, 30]
var mutableCocoaArray = NSMutableArray()
println(getClassName(swiftArray))
println(getClassName(swiftDictionary))
println(getClassName(cocoaArray))
println(getClassName(mutableCocoaArray))
Run Code Online (Sandbox Code Playgroud)
输出:
_TtCSs22ContiguousArrayStorage00007F88D052EF58
__NSDictionaryM
__NSArrayI
__NSArrayM
Run Code Online (Sandbox Code Playgroud)
你最好在Swift 中使用is和as关键字.许多基础类使用类集群(正如您可以看到的那样__NSArrayI(不可变)和__NSArrayM(可变)).
注意有趣的行为.该swiftArray默认使用一个斯威夫特Array<Int>,而swiftDictionary默认为NSMutableDictionary.有了这种行为,我就不会真正依赖某种类型的东西(先检查).
有人在上面提到了这一点,但我认为应该将可见性作为答案而不是评论。您现在可以简单地使用type(of:___):
var red, green, blue: Double
print(type(of: green))
Run Code Online (Sandbox Code Playgroud)
产量
双
| 归档时间: |
|
| 查看次数: |
26156 次 |
| 最近记录: |