swift - 具有共同属性的对象

标签 swift

我有三个不同的类 ABC,它们具有一些通用属性。例如,它们都具有名为 index 的属性。此外,它们都继承自其他没有属性 index 的类 X 并且我无法修改这些类(它来自框架)。现在我想创建这些类之一的实例化并设置 index 属性。我现在是怎么做的:

func returnPreparedObjet() -> X? {
    if some_condition1 {
        let a = A()
        a.index = 1
        return a
    }
    else if some_condition2 {
        let b = B()
        b.index = 1
        return b
    }
    else if some_condition3 {
        let c = C()
        c.index = 1
        return c
    }
    return nil
}

在不重复 .index = 1return 行的情况下实现它的最佳选择是什么?在 ABC 不继承自 X 的情况下,我也可以实现这一点吗?

最佳答案

您可以将这三个类分组在一个通用协议(protocol)下:

protocol Indexed {
    var index: Int { get set }
}

,并为三个类添加一致性

extension A: Indexed {}
extension B: Indexed {}
extension C: Indexed {} 

扩展中不需要任何代码,因为类已经声明了一个可写的 index 属性。

然后您可以将 returnPreparedObject 简化为如下所示:

func returnPreparedObject() -> X? {
    let result: (X & Indexed)?
    if some_condition1 {
        result = A()
    } else if some_condition2 {
        result = B()
    } else if some_condition3 {
        result = C()
    }
    result?.index = 1
    return result
}

关于swift - 具有共同属性的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49274349/

相关文章:

ios - ScrollView 中的文本字段仅在键盘出现 IOS 后向上移动

ios - 查询没有帐户属性的 IOS Keychain?

ios - 如何使用 SpriteKit 替换背景图像?

xcode - 如何在调试器中查看值?

ios - 如何将从 ftp URL 检索的数据转换为 Swift 中可用的对象

ios - 如何从非初始 NavigationController 场景开始

swift - URL 请求 "The operation couldn’ 中出现错误,无法完成。没有这样的文件或目录”

swift - InsertAttachment withAlternateFilename 在 iOS 10 中不起作用

xml - 需要帮助使用 Alamofire 进行 POST 调用以检索 XML

swift - 调用中的额外参数,便利初始化器