Как передать функции из экземпляра класса в массив в Swift - PullRequest
0 голосов
/ 15 марта 2019

Не уверен, что это лучший подход, но я хочу, чтобы функции были доступны по индексу, и я предпочел бы не использовать словарь.Поэтому я думал о том, чтобы поместить их в массив.

var array = [ func1, func2, ... ]

Похоже, это возможно, поскольку функции являются гражданами первого класса.

Но мне интересно, можете ли вы сделать это на уроках.То есть передать функцию из экземпляра класса в массив, не теряя при этом производительности с дополнительными замыканиями.

class Foo {
  var array: [Function]

  init() {
    array = [ f1, f2 ]
  }

  func f1() {
    return array.length
  }

  func f2(a: Int, b: Int) {
    // ... the functions are all different.
  }
}

Интересно, возможно ли что-либо подобное.

1 Ответ

2 голосов
/ 15 марта 2019

Swift Массивы однородны, но вы можете использовать Any для упаковки любого типа за счет потери информации о типе, так что да, вы можете объединить все свои функции в один массив, даже если они имеют разные типы.Я не думаю, что это хорошая идея, но на самом деле она работает:

import UIKit
import PlaygroundSupport


class Foo {
    var array: [Any] = []

    init() {
        array = [ f1, f2 ]
    }

    func f1() -> Int {
        return array.count
    }

    func f2(a: Int, b: Int) {
        // ... the functions are all different.
    }
}

может быть, это немного менее ужасно, если вы используете Objective C Runtime, поскольку он динамический, и вы можете использовать на самом делеиспользуйте execute селектор с аргументами для вызова селекторов, но я все еще не рекомендую его:

import UIKit
import PlaygroundSupport


class Foo {
    var array: [Selector] = []

    init() {
        array = [#selector(f1), #selector(f2) ]
    }

    @objc func f1() -> Int {
        return array.count
    }

    @objc func f2(a: Int, b: Int) {
        // ... the functions are all different.
    }
}

РЕДАКТИРОВАТЬ:

Опция 3, перечислить с соответствующими значениями (придумайте более значимые имена, чем у меня здесь):

import UIKit
import PlaygroundSupport


class Foo {

    enum Function {
        case void_Int(() -> Int)
        case intInt_Void((Int,Int) -> Void)
    }

    var array: [Function] = []

    init() {
        array = [.void_Int(f1), .intInt_Void(f2) ]
    }

    @objc func f1() -> Int {
        return array.count
    }

    @objc func f2(a: Int, b: Int) {
        // ... the functions are all different.
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...