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 根据字符串创建类的主要内容,如果未能解决你的问题,请参考以下文章

swift 从Swift中的字符串创建一个类?

swift学习笔记:字符转为类,代码创建控件

Swift编程中字符转为类,代码创建控件详解

swift语言,怎样获取NSString内容宽度高度

如何在swift中实现数组的深拷贝

swift 可以从字符串中收集和存储字符的Swift类。