注册 登录
主题 : swift支持反射么
级别: 新手上路
UID: 108942
精华: 0
发帖: 8
可可豆: 37 CB
威望: 17 点
在线时间: 0(时)
注册时间: 2011-11-30
最后登录: 2015-04-27
0 楼:  发表于: 2014-06-17 18:00    发自: Web Page

swift支持反射么   

api查了一圈没看到支持反射的类啊 
清空我的评分动态本帖最近评分记录: 共1条评分记录
zenny_chen 可可豆 +5 2014-06-17 难得的高端问题~
隐藏评分记录
级别: 天使

状态: 连续签到 - [7天]
UID: 5513
精华: 19
发帖: 90659
可可豆: 922081 CB
威望: 921946 点
在线时间: 5508(时)
注册时间: 2009-05-06
最后登录: 2016-08-30
1 楼:  发表于: 2014-06-17 18:08    发自: Web Page
      

这个问题好高端……加分!

你认为Apple会允许任何iOS端的代码引入反射机制吗?
Objective-C它已经提供了各种非常灵活的动态机制,但也没有完全支持反射,尽管你可以获得类名、方法名,甚至根据特定的Class来往里添加你自己的方法、成员变量和属性。但是这些都必须经过已有的类的签名。

至于Swift,俺个人认为不太会加入反射机制。因为Apple处理器有个非常牛叉的特性——它能支持可读写但不可执行这个状态。你往任何数据区填充代码然后执行(在x86中被 Intel称为自修改代码)都是不允许的~当然,Swift在Playground模式下可能是解释执行的,但对于最终上线的代码,还是经过编译的。所以不太有这个可能。
新浪围脖地址:http://t.sina.com.cn/1181389417
CPU Dasher for OS X: https://itunes.apple.com/cn/app/cpu-dasher/id1013487510?mt=12

级别: 新手上路
UID: 108942
精华: 0
发帖: 8
可可豆: 37 CB
威望: 17 点
在线时间: 0(时)
注册时间: 2011-11-30
最后登录: 2015-04-27
2 楼:  发表于: 2014-06-18 19:53    发自: Web Page
回 1楼(zenny_chen) 的帖子
哦,谢谢斑竹的回复,但是lua语言是怎么做到在ios上的动态加载代码并执行的呢?
清空我的评分动态本帖最近评分记录: 共1条评分记录
zenny_chen 可可豆 +5 2014-06-18 嗯,这个问题提得很好。
隐藏评分记录
级别: 天使

状态: 连续签到 - [7天]
UID: 5513
精华: 19
发帖: 90659
可可豆: 922081 CB
威望: 921946 点
在线时间: 5508(时)
注册时间: 2009-05-06
最后登录: 2016-08-30
3 楼:  发表于: 2014-06-18 20:32    发自: Web Page
Re:回 1楼(zenny_chen) 的帖子
引用
引用第2楼g0c0于2014-06-18 19:53发表的 回 1楼(zenny_chen) 的帖子 :
哦,谢谢斑竹的回复,但是lua语言是怎么做到在ios上的动态加载代码并执行的呢?


嗯。这个问题提得很好。
其实JavaScript都能反射,呵呵。因为它们都是解释执行的。如果你用了其解释器以及运行时环境,那么你想用它们干啥都行。

而Swift最终是被编译为真正的目标机器码,也就是说在iOS上会最终编译为ARM指令,在OS X中会被编译为x86指令集,它们都是直接靠CPU来执行的,而不是靠软件去解释执行。

当然,前一阵子Apple是不允许含有解释执行的引擎代码上传至App Store的,但是现在似乎宽松了,有不少直接用Lua引擎的应用都纷纷上线。

当然,现在Apple在iOS上还开放了JavaScriptCore,可以直接用JavaScript来写可配置的代码~
新浪围脖地址:http://t.sina.com.cn/1181389417
CPU Dasher for OS X: https://itunes.apple.com/cn/app/cpu-dasher/id1013487510?mt=12

级别: 新手上路
UID: 108942
精华: 0
发帖: 8
可可豆: 37 CB
威望: 17 点
在线时间: 0(时)
注册时间: 2011-11-30
最后登录: 2015-04-27
4 楼:  发表于: 2014-06-19 09:11    发自: Web Page
回 3楼(zenny_chen) 的帖子
ok,最后一个问题,如果swift和oc混编后,最后工程的代码执行效率跟谁接近
级别: 天使

状态: 连续签到 - [7天]
UID: 5513
精华: 19
发帖: 90659
可可豆: 922081 CB
威望: 921946 点
在线时间: 5508(时)
注册时间: 2009-05-06
最后登录: 2016-08-30
5 楼:  发表于: 2014-06-19 11:22    发自: Web Page
Re:回 3楼(zenny_chen) 的帖子
引用
引用第4楼g0c0于2014-06-19 09:11发表的 回 3楼(zenny_chen) 的帖子 :
ok,最后一个问题,如果swift和oc混编后,最后工程的代码执行效率跟谁接近


呵呵。这个你可以这么想。我不知道你有木有用过Java。Java也是依靠JVM虚拟机解释执行的,当然你可以通过JNI来写C语言。用虚拟机解释部分的性能肯定会稍差些,而用C语言的那部分函数实现自然性能会更高些。

Swift里也一样。倘若Swift性能不如ObjC,那么Swift执行部分性能可能会低些,而ObjC实现的方法执行的时候性能就会更高些了~

新浪围脖地址:http://t.sina.com.cn/1181389417
CPU Dasher for OS X: https://itunes.apple.com/cn/app/cpu-dasher/id1013487510?mt=12

级别: 新手上路
UID: 329285
精华: 0
发帖: 49
可可豆: 115 CB
威望: 63 点
在线时间: 28(时)
注册时间: 2014-06-19
最后登录: 2014-07-07
6 楼:  发表于: 2014-06-19 14:19    发自: Web Page
从api看,支持。Mirror 类。
级别: 天使

状态: 连续签到 - [7天]
UID: 5513
精华: 19
发帖: 90659
可可豆: 922081 CB
威望: 921946 点
在线时间: 5508(时)
注册时间: 2009-05-06
最后登录: 2016-08-30
7 楼:  发表于: 2014-06-19 14:26    发自: Web Page
引用
引用第1楼zenny_chen于2014-06-17 18:08发表的  :
      

这个问题好高端……加分!

你认为Apple会允许任何iOS端的代码引入反射机制吗?
.......




从更宽松的意义上讲,ObjC是支持反射的,呵呵~
不好意思,我把Java那种动态编译自动生成类的东西跟反射搞在一起了。反射不需要具备能够自动加载新的数据类型的功能。只要能够修改特定数据结构里的成员、方法等就算是支持了。

这里是wikipedia对于反射的解释——http://en.wikipedia.org/wiki/Reflection_(computer_programming)#Objective-C

至于Swift目前俺还不晓得~
新浪围脖地址:http://t.sina.com.cn/1181389417
CPU Dasher for OS X: https://itunes.apple.com/cn/app/cpu-dasher/id1013487510?mt=12

级别: 天使

状态: 连续签到 - [7天]
UID: 5513
精华: 19
发帖: 90659
可可豆: 922081 CB
威望: 921946 点
在线时间: 5508(时)
注册时间: 2009-05-06
最后登录: 2016-08-30
8 楼:  发表于: 2014-06-19 14:34    发自: Web Page
引用
引用第6楼andelf于2014-06-19 14:19发表的  :
从api看,支持。Mirror 类。


请问有木有对Mirror类较详细的介绍呢?
新浪围脖地址:http://t.sina.com.cn/1181389417
CPU Dasher for OS X: https://itunes.apple.com/cn/app/cpu-dasher/id1013487510?mt=12

级别: 天使

状态: 连续签到 - [7天]
UID: 5513
精华: 19
发帖: 90659
可可豆: 922081 CB
威望: 921946 点
在线时间: 5508(时)
注册时间: 2009-05-06
最后登录: 2016-08-30
9 楼:  发表于: 2014-06-19 15:01    发自: Web Page
回 楼主(g0c0) 的帖子
      

确实根据6楼的朋友所说,可以玩反射!
请参考以下代码(修改自Stackoverflow上的)

class Fruit {
    var name = "Apple"
}

var memCount = reflect(Fruit()).count
var memberName = reflect(Fruit())[0].0
var memberValue = reflect(Fruit())[0].1.summary;

println("member count = \(memCount)")         // 1
println("The first member name is: \(memberName)")  // "name"
println("The first member value is: \(memberValue)")  // "Apple"



上面的reflect函数其实就是满足Mirror协议的。现在还没时间深入研究,可以先看看~
新浪围脖地址:http://t.sina.com.cn/1181389417
CPU Dasher for OS X: https://itunes.apple.com/cn/app/cpu-dasher/id1013487510?mt=12

CocoaChina社区转载内容已尽可能注明出处,如未能核实来源或转发内容图片有权利瑕疵的,请及时联系社区进行修改或删除【联系方式QQ : 3442093904 邮箱:support@cocoachina.com】文章内容为作者独立观点,不代表CocoaChina社区立场。版权归原作者所有,如申请授权请联系作者,因文章侵权CocoaChina社区不承担任何法律及连带责任。

描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部