72246


以下のViewController.swiftで、ボタンをタップしたときにTestClassのprintFunctionを呼び出す際に、1回目にボタンを押すとinit関数も呼び出され、以下のようにprintされます。

[code]

    init
    function
    
[/code]

しかし、2回目にボタンを押すと、`init`が呼び出されず、`function`だけがprintされます。  
これを、複数回押してもinitが呼び出されるようにするにはどうしたら良いですか？

毎回initを呼びたいというわけではなく、initを呼ぶときと呼ばないときを両方使い分けられるようにしたいです。

**ViewController.swift**

[code]

    import UIKit
    import Foundation
    
    class TestClass: NSObject {
        static let shared = TestClass()
        
        override init() {
            print("init")
            super.init()
        }
        
        func printFunction()
        {
            print("function")
        }
    }
    
    class ViewController: UIViewController {
        var loop = 0
        @IBOutlet weak var button: UIButton!
        @IBOutlet weak var firstView: UIView!
        
        override func viewDidLoad() {
            super.viewDidLoad()
            self.view.addSubview(firstView)
            self.view.addSubview(button)
            
        }
        
        @IBAction func testButtonTapped(_ sender: Any)
        {
            TestClass.shared.printFunction()
        }
        
        
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    }
    
[/code]


CC BY-SA 4.0
2020-11-27T18:20:53.923
72245
2020-11-27T20:28:20.887
36446
question
swift
Swiftでinit()を複数回呼び出しする方法


> 複数回押してもinitが呼び出されるようにするにはどうしたら良いですか？

> 毎回initを呼びたいというわけではなく、initを呼ぶときと呼ばないときを両方使い分けられるようにしたいです。

**そのような方法はありません。**

`init`はイニシャライザですので、インスタンスが生成される時に一度だけ呼び出されます。インスタンスの生成と関係なしに呼び出すことはできません。

そのような処理が必要であれば、通常メソッドとして定義して呼び出してください。

[code]

    import UIKit
    //import Foundation
    
    class TestClass: NSObject {
        static let shared = TestClass()
        
        override init() {
            super.init()
            reset()
        }
        
        func reset() {
            print("reset")
        }
        
        func printFunction() {
            print("function")
        }
    }
    
    class ViewController: UIViewController {
        var loop = 0
        @IBOutlet weak var button: UIButton!
        @IBOutlet weak var firstView: UIView!
        
        override func viewDidLoad() {
            super.viewDidLoad()
            self.view.addSubview(firstView)
            self.view.addSubview(button)
        }
        
        @IBAction func testButtonTapped(_ sender: Any) {
            TestClass.shared.reset()
            TestClass.shared.printFunction()
        }
        
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    }
    
[/code]

プロパティの初期化や親クラスの初期化(`super.init`)に関する動作も再実行したいのであれば、もっと話は複雑になるでしょう。そのような場合については、`static
let shared = `のようなシングルトンとせず、毎回インスタンスを生成した方が良いでしょう。


CC BY-SA 4.0
2020-11-27T20:28:20.887
72246
2020-11-27T20:28:20.887
13972
72245
answer