스위프트넘버상속
스위프트에서 열거형을 상속할 수 있습니까?열거 상속과 관련하여 주의해야 할 규칙은 무엇입니까?
다음 테스트 코드:
enum TemperatureUnit: Int {
case Kelvin, Celcius, Farenheit
}
enum TemperatureSubunit : Temperature {
}
생성하다
error: type 'TemperatureSubunit' does not conform to protocol 'RawRepresentable'
스위프트 언어에는 Structs, Enum, Class가 있습니다.Struct와 Enum은 복사를 통해 전달되지만 Class는 참조를 통해 전달됩니다.클래스만 상속을 지원하고 Enum과 Struct는 지원하지 않습니다.
따라서 질문에 답하려면 Enum(및 Struct 유형)을 상속할 수 없습니다.여기를 확인해 보십시오.
Korpel이 이미 답변했듯이, 현재 Enums에 대해 지원되는 실제 상속이 없습니다.따라서 특정 Enum을 확장하고 다른 Enum의 경우를 상속하도록 할 수 없습니다.
그러나 완성을 위해 Enums는 프로토콜을 지원하며 Swift 2에서 소개된 프로토콜 확장과 새로운 프로토콜 지향 프로그래밍 접근법(이 비디오 참조)과 함께 상속과 유사한 것을 구현할 수 있다고 덧붙이고 싶습니다.이것은 제가 정의할 때 많이 사용하는 기술입니다.UITableViewController
:s는 enums에 의해 구동되며, 테이블의 섹션과 각 섹션 내의 행을 지정하고 몇 가지 유용한 동작을 추가합니다.예를 들어 다음 샘플 코드를 참조하십시오.
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
}
}
이전 코드에서는 다음 표를 렌더링했습니다.
프로토콜을 구현하는 방법을 주목하십시오.RegisterTableSection
enum은 프로토콜에 정의된 메서드 및 변수에 구현을 제공해야 합니다.그리고 가장 흥미로운 것은, 이것이 변수의 기본적인 구현을 이어 받는다는 것입니다.mandatoryTitle
을 통하여TableSection
프로토콜 확장
이 예제의 소스 코드를 여기에 업로드했습니다.
예를 들어, 스위프트에서 열거형이 다른 열거형 값을 포함할 수 있습니까?
세부 사항
테스트 대상:
- Xcode 9.2, Swift 4, 3
- Xcode 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)
결과
언급URL : https://stackoverflow.com/questions/33191532/swift-enum-inheritance
'programing' 카테고리의 다른 글
Android on Click in XML vs.OnClickListener (0) | 2023.10.07 |
---|---|
maria db 10에서 체크인할 때 삽입 데이터에 대한 sql 구문 오류? (0) | 2023.10.02 |
포인터를 argv로 포인터 표시 (0) | 2023.10.02 |
Angular 6에서 암호 유효성 확인 (0) | 2023.10.02 |
한 열의 값이 서로 다른 가장 최근의 레코드 3개를 선택합니다. (0) | 2023.10.02 |