【Swift4】文字列の関数名から関数を実行し、戻り値を得る方法

2020年8月29日

文字列の関数名から関数を実行して、その関数による戻り値を得る方法をご紹介します。

TableViewやCollectionViewのセルごとに別の関数を呼び出したい場合、if文やswitch文で分岐させているとコードが長くなりますし10個ぐらいの分岐ならまだしも、それ以上となると記述がとても大変です。

文字列の関数名から関数を実行する方法を知っているとこういった場合に便利ですので覚えて起きましょう。

文字列の関数名から関数を実行し、戻り値を得る方法

1.文字列を返す関数を作成する

import UIKit

class Common: NSObject {

    @objc static func test() -> (String) {
        return "テスト"
    }
    
}

まず新しいクラスCommonを作成してクラス関数(static)のtestを作成します。
この関数は必ず「テスト」という文字列を返すようにしています。

2.文字列から関数を呼び出す

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    
    let funcName = "test"
    let str = Common.perform(Selector(funcName)).takeUnretainedValue() as! String
    print(str)
    
}

次に、呼び出したいファイルで先ほど作ったCommonクラスのクラス関数testを呼び出します。
今回はViewController.swiftで呼び出しを行なっています。

Commonの後にperform()関数を使用しています。この関数はUnmanaged<AnyObject>を返します。ですので、さらにtakeUnretainedValue()関数を使用して参照型のポインターへと変換してあげます。これでインスタンスとして戻り値を取り出すことができます。