Xcodeでアプリを作っているとselfというものがよく出て来るけれど、
何のことだかいまいちわからなかったり、

いろんなところでselfが出て来るから、関数にまとめちゃったりしたいんだけど、
selfがなんだかわからないから、関数で使えない…

という感じで困ったことが多かったので、
selfについてわかったことを、私なりにメモしておこうと思います。

selfとは

selfとは、
selfという文字が書かれている、そのクラス自体のことを言うらしいです。

そのため、例えばこんな、classTestという名前のクラスがあったとしたら、

//クラス
class classTest {
}

selfというのはclassTest自体の事を指すみたいです。

viewDidLoadなどで使うselfとは

では、よくあるviewDidLoadの中に書かれているselfとは何かと言うと…

(設定や内容によって違うかもしれませんが)

自分が作った「なんちゃらViewController」という名前の
UIViewControllerの事を指すようでした。

つまり、

class FirstViewController: UIViewController {

例えばこんな風に書かれている場合、
FirstViewController」という名前のUIViewControllerが
selfにあたるようです。

viewDidLoadなどで使うself、使い方の例

そこで、実際にselfを使った場合の例を書いてみたいと思います。

<self.titleを他のファイルで取得してみる>

例えば、「FirstViewController」という名前のUIViewControllerがあり、
この中のタイトル(self.title)を、
他のファイル「testFile.swift」にある「funcTest」内で取得したい場合。

上が「FirstViewController.swift」、下が「testFile.swift」

(見やすいように、画像内のコードを以下に貼り付けておきます)

FirstViewController.swift

import UIKit

class FirstViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //このタイトルを、他の場所でも取得したい。
        self.title = “selftitle”
    }

testFile.swift

import Foundation

func funcTest() {
    
    //ここでselfのtitleを使いたい
    
}

<この場合のselfは、これ>

この場合、self.titleのselfは、
FirstViewController」という名前のUIViewControllerの事になるようです。

それでは、実際にself.titleを取得してみたいと思います。

こんな感じで取得できます。それでは、以下、説明です。

funcTestの中で
UIViewControllerに関する値(self.title)を取得したいので、
funcTestでUIViewControllerの値を取得できるようにします。

例えば、こんな感じです。

func funcTest(_ sender: UIViewController) {
}

この時に、import UIKitも付け加えてください。
(UiViewControllerを使うために必要だからです。
 つけ忘れると、エラーになっちゃいます)

import Foundation
import UIKit

func funcTest(_ sender: UIViewController) {
}

あとは、senderのtitleを取得すれば、値を取得できました。

import Foundation
import UIKit

func funcTest(_ sender: UIViewController) {
    
    let myTitle:String = sender.title!
    
}

<それでは、全体のコード例のまとめ>

もう一度、全体のコードです。

全体のコードを再度書いておきたいと思います。

FirstViewController.swift

import UIKit

class FirstViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //このタイトルを、他の場所でも取得したい。
        self.title = “selftitle”
        
        //ここで、他のファイルにある「funcTest」を呼び出してみる
        funcTest(self)
    }

testFile.swift

import Foundation
import UIKit //UIViewControllerを使う時は、これが必要。

func funcTest(_ sender: UIViewController) {
    
    //ここでselfのtitleを使いたい
    
    let myTitle:String = sender.title!
    print(“title:  \(myTitle)  “)
    
}

長い間うまくできず、悩んだ末にやってみた方法なので、
間違いなど気づいた方がいらっしゃいましたら、
教えていただけるとありがたいです!

スポンサーリンク