Передайте тип класса в качестве параметра функции и используйте как?бросить класс - PullRequest
0 голосов
/ 05 декабря 2018

Есть ли способ передать тип класса через функцию и попытаться преобразовать класс в данный тип класса?Я попробовал следующий код.

class Section {}
class TimeSection: Section {}
class TaskSection: Section {}

let timeSection = TimeSection()
let taskSection = TaskSection()

let sections = [timeSection, taskSection]

func findSection(from classType: Section.Type) {
    for section in sections {
        guard let section = section as? classType else { continue }

        print("Found section")
    }
}

findSection(from: TimeSection.self)

Но я всегда получаю эту ошибку:

Use of undeclared type 'classType'

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Swift 4.2

Вы можете использовать универсальную функцию и ограничить параметр типа разделом.

import Foundation

class Section {}
class TimeSection: Section {}
class TaskSection: Section {}
class NoSection {}

let timeSection = TimeSection()
let taskSection = TaskSection()

let sections = [timeSection, taskSection]

func findSection<T: Section>(from classType: T.Type) {
    for section in sections {
        guard let section = section as? T else { continue }

        print("Found section: \(section)")
    }
}

findSection(from: TimeSection.self) // Found section: __lldb_expr_9.TimeSection
findSection(from: TaskSection.self) // Found section: __lldb_expr_9.TaskSection
findSection(from: NoSection.self) // won't compile
0 голосов
/ 05 декабря 2018

classType на самом деле не тип.Это параметр, который содержит экземпляр Section.Type.Следовательно, вы не можете использовать его с as?.

Поскольку это параметр, вы можете сравнить его с ==.Другая сторона == должна быть экземпляром метатипа section, который может быть получен с помощью type(of:).

func findSection(from classType: Section.Type) {
    for section in sections {
        if type(of: section) == classType {
            print("Found section")
            break
        }
    }
}
...