从Swift REPL,如何获取表达式的静态类型?

藻类

从Swift REPL,如何获取表达式的静态类型?

例如,在Haskell中,我可以:type用来获取表达式的类型:

Prelude> :type "hello"
"hello" :: [Char]

Prelude> :type (1 + 1)
(1 + 1) :: Num a => a

这表示“ hello”的类型是的列表Char,而(1 + 1)的类型a是type class中的某种类型Num

Swift REPL上没有明显的方法可以执行此操作,但我认为使用该语言已提供的功能可能是可行的。到目前为止,这是我已经弄清楚的。如果有人持有这个难题的缺失,我将很高兴。

这些是各种选择,没有一个是正确的:

1. dynamicType

顾名思义,dynamicType返回实例的动态确定类型,而不是计算实例的表达式的静态类型。另外,对于REPL类型,它似乎不适用于REPL:

1> 1.dynamicType
error: could not fetch result -- Couldn't apply expression side effects : Couldn't dematerialize result: corresponding symbol wasn't found
2> struct Foo { let val:Int = 1 }
3> let f = Foo()
4> f.dynamicType
error: could not fetch result -- Couldn't apply expression side effects : Couldn't dematerialize result: corresponding symbol wasn't found

2. _stdlib_getDemangledTypeName(foo)

此函数(由可能希望保持匿名的贡献者建议)返回一个字符串,其名称为foo类型。但是,它计算表达式foo。而且,它并不总是返回静态类型,正如运行下面的脚本所看到的那样,其中,解拆功能将给出随机计算的动态类型A或B之一的名称,而不是静态可确定的类型Any:

#!/usr/bin/swift
import Foundation

class Letter { } ; class A : Letter {} ; class B : Letter {}
func randomAny() -> Any { println("side-effecting!"); return (arc4random() % 2) == 0 ? A() : B() }
let x : Any = randomAny()  // x has the static type of Any
let typeNameOfX = _stdlib_getDemangledTypeName(x)
println("the constant x with static type Any reports a type name of : \(typeNameOfX)")

3.自定义通用函数

听起来最接近的是Twitter上@jckarter的建议,以定义以下功能:

func staticType<T>(@autoclosure () -> T) -> T.Type { return T.self }

由于函数在闭包中捕获其自变量,因此不会评估自变量,因为从不调用闭包。但是,这有两个缺点:

  1. 在REPL上调用它只会产生一个错误。
  2. 在脚本中调用它会返回一个MetaType实例,并且似乎没有通用的方法可以从MetaType实例转换为人类可读的字符串,以指示该实例描述的类型。

如果我们知道如何获取ObjC和Swift类型的MetaType的名称,这足以使最后一种方法起作用,至少在脚本中(如果不是REPL的话)。

林太郎

Swift REPL自动打印表达式的类型和结果。

  1> 1 + 1
$R0: Int = 2

所以也许可以使用:

  1> ({ 1 + 1 })
$R0: (() -> Int) = ($__lldb_expr8`__lldb_expr_1.(closure #1) at repl.swift:1)
            ^^^

或者

  1> reflect({ 1 + 1 }).valueType
$R0: Any.Type = () -> Int
                      ^^^
  2> ({ 1 + 1 }).dynamicType as Any.Type
$R1: Any.Type = () -> Int

最后,稍微调整一下3.自定义通用函数

  1> func typeof<T>(@autoclosure () -> T) -> Any.Type { return T.self } 
  2> typeof(1 + 1)
$R0: Any.Type = Swift.Int

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Swift:无法转换表达式的类型

来自分类Dev

Swift:无法转换表达式的类型

来自分类Dev

表达式类型类型错误(Swift 2)

来自分类Dev

Swift如何消除表达式上下文中的类型参数?

来自分类Dev

Swift正则表达式-如何提取匹配的组

来自分类Dev

如何调整swift表达式编译超时?

来自分类Dev

Swift Closures:无法将“()”类型的返回表达式转换为“LiveSearchResponse”类型的返回类型?

来自分类Dev

Swift等同于静态Objective-C表达式

来自分类Dev

Swift等同于静态Objective-C表达式

来自分类Dev

Swift无法将表达式的类型'()'转换为CGRect类型

来自分类Dev

无法将表达式类型UIImage转换为void swift类型

来自分类Dev

Swift 2:“ Bool”类型的表达式模式不能与“ Int”类型的值匹配

来自分类Dev

Swift无法将表达式的类型“无效”转换为“字符串!”类型

来自分类Dev

Swift返回“无法将表达式的类型'NSArray'转换为'NSManagedObject'类型”

来自分类Dev

Swift正则表达式格式?

来自分类Dev

在Swift中分配条件表达式?

来自分类Dev

Swift正则表达式

来自分类Dev

Swift中的正则表达式

来自分类Dev

Swift 正则表达式优化

来自分类Dev

无法将表达式的类型int转换为void swift

来自分类Dev

Swift无法将表达式的类型“无效”转换为“字符串!”

来自分类Dev

Swift-addConstraint:无法将表达式的类型(约束:[AnyObject])转换为“ StringLiteralConvertible”

来自分类Dev

在Swift中-表达式类型不明确,没有更多上下文

来自分类Dev

在Swift中,此Objective-C安全类型转换表达式等效吗?

来自分类Dev

无法分配给 Swift 类型的不可变表达式

来自分类Dev

在带有Swift的函数中使用类型擦除返回通用类型(无法转换类型的返回表达式…)

来自分类Dev

swift - 如何在没有更多上下文的情况下快速修复“表达式类型”CGSize“不明确”?

来自分类Dev

Xcode-Swift编译器错误:无法将表达式的类型“ Double”转换为类型“ Double”

来自分类Dev

Swift中的HomeKit完成块:无法将表达式的类型“无效”转换为类型“字符串!”

Related 相关文章

  1. 1

    Swift:无法转换表达式的类型

  2. 2

    Swift:无法转换表达式的类型

  3. 3

    表达式类型类型错误(Swift 2)

  4. 4

    Swift如何消除表达式上下文中的类型参数?

  5. 5

    Swift正则表达式-如何提取匹配的组

  6. 6

    如何调整swift表达式编译超时?

  7. 7

    Swift Closures:无法将“()”类型的返回表达式转换为“LiveSearchResponse”类型的返回类型?

  8. 8

    Swift等同于静态Objective-C表达式

  9. 9

    Swift等同于静态Objective-C表达式

  10. 10

    Swift无法将表达式的类型'()'转换为CGRect类型

  11. 11

    无法将表达式类型UIImage转换为void swift类型

  12. 12

    Swift 2:“ Bool”类型的表达式模式不能与“ Int”类型的值匹配

  13. 13

    Swift无法将表达式的类型“无效”转换为“字符串!”类型

  14. 14

    Swift返回“无法将表达式的类型'NSArray'转换为'NSManagedObject'类型”

  15. 15

    Swift正则表达式格式?

  16. 16

    在Swift中分配条件表达式?

  17. 17

    Swift正则表达式

  18. 18

    Swift中的正则表达式

  19. 19

    Swift 正则表达式优化

  20. 20

    无法将表达式的类型int转换为void swift

  21. 21

    Swift无法将表达式的类型“无效”转换为“字符串!”

  22. 22

    Swift-addConstraint:无法将表达式的类型(约束:[AnyObject])转换为“ StringLiteralConvertible”

  23. 23

    在Swift中-表达式类型不明确,没有更多上下文

  24. 24

    在Swift中,此Objective-C安全类型转换表达式等效吗?

  25. 25

    无法分配给 Swift 类型的不可变表达式

  26. 26

    在带有Swift的函数中使用类型擦除返回通用类型(无法转换类型的返回表达式…)

  27. 27

    swift - 如何在没有更多上下文的情况下快速修复“表达式类型”CGSize“不明确”?

  28. 28

    Xcode-Swift编译器错误:无法将表达式的类型“ Double”转换为类型“ Double”

  29. 29

    Swift中的HomeKit完成块:无法将表达式的类型“无效”转换为类型“字符串!”

热门标签

归档