【问题标题】:How to automate factory design pattern in swift?如何快速自动化工厂设计模式?
【发布时间】:2023-03-25 14:49:01
【问题描述】:

我想自动化这段代码:

    let objectType = json["object"]["type"].stringValue;

    switch objectType {
        case "Message":
            activity.item = MessageLib.make(json["object"]) as! MessageItem;
        default:
        ()
    }

我想根据它的类型制作一个对象。但是我不想为每个新的 ObjectType 写一个新的案例。我只想创建一个新的对象类。 OBJECTTYPEItem

【问题讨论】:

  • 你到底想完成什么?
  • 我希望它自己决定使用哪个子类。
  • 但映射不可避免地必须指定某处
  • 否则您的代码将如何计算每种类型的处理方式。这样做没有错。如果你不想,你可以使用枚举来确保所有案例都得到处理。
  • 运气不好的伙伴。 Swift 具有编译时类型推断的强类型。像这样的东西不会很快起作用。您可以下拉到 Objective C 并使用以下答案。

标签: swift design-patterns factory factory-pattern


【解决方案1】:

如果您的类不是纯 swift 类并且继承自 NSObject,我建议使用类似 NSClassFromString 的类并从中创建对象。

let objectType = json["object"]["type"].stringValue;
var classType = NSClassFromString(objectType)
var classVariable = classType()

您可以使用该类将此类类型转换为您的任何类

var myClassType = classType as! MyClass.type

【讨论】:

  • 为此,该类必须是 Objective-C 类或标记为 @objc 的 Swift 类。这适用于纯 swift 类吗?
  • 如何调用它的方法? Swift 不会知道它的方法或返回类型!
  • 我不喜欢 Swift 的一件事。缺乏活力,KVC。 :D
  • @XIII 在某些时候,您肯定必须使用 switch 方法或其他方法将此类强制转换为您的自定义类。因为你需要在这个类上调用函数/设置变量。
  • @iosDev82 你是对的。我认为最好的方法是坚持使用开关盒。 :|
【解决方案2】:

这是我遵循@Shamas S 指示的工厂,包括一些添加的代码以使其更通用。如果 ContentItemFactory 不继承自 NSObject,编译器不会报错,但您必须导入 Foundation 框架才能使用NSClassFromString

在我的例子中,所有创建的类对象都是“ContentItem”类的子类,它由init(fromDictionary dictionary: [String:Any]) 初始化,所以我必须在初始化器之前使用required 关键字。

import Foundation
class ContentItemFactory {

    class func create(fromDictionary dictionary: [String:Any]) -> ContentItem{

        if let objectType = dictionary["type"] as? String{
            let namespace = (Bundle.main.infoDictionary!["CFBundleExecutable"] as! String).replacingOccurrences(of: " ", with: "_")
            let myClass = NSClassFromString("\(namespace).\(objectType)") as! ContentItem.Type
            return myClass.init(fromDictionary:dictionary)
        }
        return ContentItem.init(fromDictionary: dictionary)
    }
}

class ContentItem {
    required init(fromDictionary dictionary: [String:Any]){

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多