当前位置: 首页 > 知识库问答 >
问题:

快速枚举继承

楚方伟
2023-03-14

你能在Swift中继承枚举吗?关于枚举继承,应该知道哪些规则?

以下测试代码:

enum TemperatureUnit: Int {
    case Kelvin, Celcius, Farenheit
}

enum TemperatureSubunit : Temperature {  
}

产生

error: type 'TemperatureSubunit' does not conform to protocol 'RawRepresentable'

共有3个答案

狄宇
2023-03-14

看看我的例子,它要容易得多:一个枚举可以在Swift中包含另一个枚举值吗?

测试日期:

  • 代码9.2、Swift 4和3
  • 代码10.2(10E125)和11.0(11A420a),Swift 5
enum State {
    case started
    case succeeded
    case failed
}

enum ActionState {
    case state(value: State)
    case cancelled
}

ActionState枚举有4个值:

.state(value: .started)
.state(value: .succeeded)
.state(value: .failed)
.cancelled
import Foundation

enum StringCharactersTransformType {
    case upperCase
    case lowerCase
}

enum StringTransformType {
    case state(value: StringCharactersTransformType)
    case normal

    static var upperCase: StringTransformType {
        return .state(value: .upperCase)
    }

    static var lowerCase: StringTransformType {
        return .state(value: .lowerCase)
    }
}

var type = StringTransformType.normal
print(type)
type = .upperCase
print(type)
type = .lowerCase
print(type)
洪高扬
2023-03-14

正如Korpel已经回答的那样,目前不支持枚举的实际继承。因此,不可能让某个枚举扩展并继承另一个枚举的实例。

然而,我想补充一点,ENums确实支持协议,加上Swift 2中引入的协议扩展和新的面向协议的编程方法(见本视频),实现类似继承的东西是可能的。这是我经常使用的一种技术,用于定义由枚举驱动的UITableViewController: s,指定表的部分和每个部分中的行,并添加一些有用的行为。例如,请参阅以下示例代码:

import UIKit

protocol TableSection {
    static var rows: [Self] { get }

    var title: String { get }

    var mandatoryField: Bool { get }
}

extension TableSection {
    var mandatoryTitle: String {
        if mandatoryField {
            return "\(title)*"
        } else {
            return title
        }
    }
}

enum RegisterTableSection: Int, TableSection {
    case Username
    case Birthdate
    case Password
    case RepeatPassword

    static var rows: [RegisterTableSection] {
        return [.Username, .Password, .RepeatPassword]
    }

    var title: String {
        switch self {
        case .Username:
            return "Username"
        case .Birthdate:
            return "Date of birth"
        case .Password:
            return "Password"
        case .RepeatPassword:
            return "Repeat password"
        }
    }

    var mandatoryField: Bool {
        switch self {
        case .Username:
            return true
        case .Birthdate:
            return false
        case .Password:
            return true
        case .RepeatPassword:
            return true
        }
    }
}

class ViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return RegisterTableSection.rows.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        guard let row = RegisterTableSection(rawValue: indexPath.row) else {
            // This should never happen
            return UITableViewCell()
        }

        let cell = UITableViewCell()
        cell.textLabel?.text = row.mandatoryTitle
        return cell

    }
}

前面的代码将呈现下表:

请注意,通过实现协议,我们的RegisterTableSectionenum必须为协议中定义的方法和变量提供实现。最有趣的是,它通过TableSection协议扩展继承了变量mandatoryTitle的默认实现

我已经在这里上传了这个例子的源代码

童琪
2023-03-14

在Swift语言中,我们有结构、枚举和类。结构和枚举是通过副本传递的,而类是通过引用传递的。只有类支持继承,枚举和结构不支持继承

因此,为了回答您的问题,您不能使用枚举(和结构类型)继承。看看这里:

StackOverflow区别类与结构

 类似资料:
  • 主要内容:1. Objective-C集合快速枚举是Objective-C的功能,用于枚举集合。 因此,要了解快速枚举,首先需要了解集合,这将在下一节中进行说明。 1. Objective-C集合 集合是基本结构。它用于保存和管理其他对象。 集合的主要目的是提供一种有效存储和检索对象的通用方法。 有几种不同类型的集合。 虽然它们都能实现能够容纳其他对象的相同目的,但它们的主要区别在于检索对象的方式。 Objective-C中使用的最常见的

  • 快速枚举是Objective-C的功能,有助于枚举集合。 因此,为了了解快速枚举,我们首先需要了解集合,这将在下一节中进行说明。 Objective-C中的集合 集合是基本结构。 它用于保存和管理其他对象。 集合的整个目的是提供一种有效存储和检索对象的通用方法。 有几种不同类型的集合。 虽然它们都能实现能够容纳其他对象的相同目的,但它们的主要区别在于检索对象的方式。 Objective-C中使用的

  • 问题内容: 为什么Java中的枚举不能从其他枚举继承?为什么以这种方式实施? 问题答案: 例子 因为将元素添加到枚举将有效地创建超类,而不是子类。 考虑: 这与常规类的工作方式相反。我想可以以这种方式实施,但实施起来比看起来要复杂得多,而且肯定会使人们感到困惑。

  • 问题内容: 您可以在Swift中继承枚举吗?关于枚举继承,应该注意哪些规则? 以下测试代码: 产生 问题答案: 在Swift语言中,我们有Structs,Enum和Classs。Struct和Enum通过副本传递,而类通过引用传递。只有类支持继承,枚举和结构不支持。 因此,要回答您的问题,您不能继承Enum(和Struct类型)。在这里看看:

  • 问题内容: 我正在使用wahoo Fitness API,它定义了以下Objective-C枚举: 我找不到快速使用它的方法。我首先尝试对其进行切换/操作,但未成功。我正要继续进行以下操作: 但是它不能编译: 任何解决方法?我阅读使用,但在xcode beta-4中不起作用。 问题答案: 如您所说,从.beta 4开始,使用.value获取基础整数的解决方法不再起作用。 不幸的是an 不能从Obj