swift 根据字符串创建类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift 根据字符串创建类相关的知识,希望对你有一定的参考价值。
参考技术A 根据后台的返回字段,创建不同的类,以满足动态界面的展示需求分2种情况,一种是由后端穿字符串,转换原生类,一种是本地类 通用化转换
目前转换类有2个方法 classForCoder()和NSClassFromString()
第一种转换,自带命名空间,第二个单纯的类名
1、获取命名空间-CFBundleExecutable这个键对应的值就是项目名称,也就是命名空间
let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String
2、转化:
let classType:AnyClass? = NSClassFromString(nameSpace + "." + className)
如果是classForCoder()不需要以上操作
3、通过类创建对象 将anyClass转换为指定的类型
let viewController = classType as! UIViewController.Type
4、通过class创建对象
let vc = viewController.init()
至此完成
使用 Swift 4 创建 SKSpriteNode 类
【中文标题】使用 Swift 4 创建 SKSpriteNode 类【英文标题】:Creating an SKSpriteNode class with Swift 4 【发布时间】:2018-03-12 20:52:47 【问题描述】:我使用 Swift 4 和 XCode 编写了一个简单的游戏,并且在 GameScene 中编写了所有内容。我的所有元素(怪物、玩家、弹丸等)都在 GameScene 中编码。
我想将我的代码转移到专门的类中(类播放器、类怪物等)
我想知道 SKSpriteNode 类的基本结构以及 GameScene 中该类的调用,以便更有效地调整我的代码。
这是我尝试过的一个示例:
class Vaisseau: SKSpriteNode /*: Creatures */
var coeur: Int = 0
init(texture: SKTexture, size: CGSize)
let texture = SKTexture(imageNamed: "player")
super.init(texture: texture, color: UIColor.clear, size: texture.size())
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
还有GameScene中的初始化:
let player = Vaisseau()
这是它在 GameScene 中的实际定义方式:
let player = SKSpriteNode(imageNamed: "player")
【问题讨论】:
【参考方案1】:你声明你的 init 有两个参数 (texture: SKTexture, size: CGSize)
但你没有在你的初始化调用中传递参数
let player = Vaisseau()
您要么需要将初始化更改为...
let texture = SKTexture(imageNamed: "player")
let player = Vaisseau(texture: texture, size: texture.size())
并将初始化更改为
init(texture: SKTexture, size: CGSize)
super.init(texture: texture, color: UIColor.clear, size: size)
或将类中的 init 更改为...
init()
let texture = SKTexture(imageNamed: "player")
super.init(texture: texture, color: UIColor.clear, size: texture.size())
并将您的初始化调用保留为...
let player = Vaisseau()
player.position = CGPoint(x: 500, y: 500)
addChild(player)
EDIT 添加了上述两行以向您显示那些需要在场景中 但其他项目,如 alpha、zPosition、动作、zRotation 等可以在类中
您需要问自己以确定使用哪一个是“玩家的纹理会有所不同吗?”如果是这样,您可能需要考虑传入纹理的第一个选项。
【讨论】:
纹理不会改变,所以我将使用第二个选项。并且“addChild(player)”是否应该留在 GameScene 的函数 didMove(to view: SKView) 中?因为我的播放器元素停留在场景的右下角,所以我想知道 addChild 的位置是否是原因。 (如果您需要看清楚,我可以编辑帖子中的“addChild”代码) addChild 部分必须保留在场景中(因为它正在添加到场景中),同样您也希望将定位放置在场景代码中而不是类中。 (见我的编辑)以上是关于swift 根据字符串创建类的主要内容,如果未能解决你的问题,请参考以下文章