22
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Swift4] privateにextensionからアクセスできる

Last updated at Posted at 2017-06-18

Swift4でできるようになること

private指定したプロパティやメソッドに同一ファイル内のextensionからアクセスできるようになります。

sample.swift

struct someStruct {

    private let privateProperty = "private"
    fileprivate let fileprivateProperty = "fileprivate"
}

// 同一ファイル内のextensionじゃないとアクセスできない
extension someStruct {

    // privateなプロパティ・メソッドにアクセス可能(Swift3ではできなかった)
    func printPrivateProperty() {
        print(privateProperty)
    }
}

fileprivateで嫌だったこと

個人的にはfileprivateでモヤモヤすることがありました。

Swift3までの場合、extensionで利用するためにfileprivate指定する、ということはよくあるかと思います。
そうすると、スコープとしてはそのクラスや構造体内に留めておきたい、という場合に不都合がありました。
同一ファイル内の別のクラスや構造体等からアクセスできてしまうからです。

stored property以外はprivateextension内にまとめる、ということもできますが。
アクセス出来てしまうこと自体がしっくりきませんでした。

sample.swift

//  Swift3の場合

struct someStruct {

    // extension内で使いたいのでfileprivate指定
    fileprivate let fileprivateProperty = "fileprivate"
}

extension someStruct {

    func printFileprivateProperty() {
        print(fileprivateProperty)
    }
}

struct otherStruct {

    let some = someStruct()

    // fileprivateはアクセス可能
    // 意図どおりであればもちろんOKだが、
    // Swift3まではextensionのためのみに使うプロパティ・メソッドも
    // fileprivateにするしかなく、意図せぬアクセスが可能な状態になっていた
    func printSomeFileprivateProperty() {
        print(some.fileprivateProperty)
    }
}

privateでOKになって嬉しい

Swift4で上記が解消されます。
意図通りのスコープになって嬉しい!

sample.swift

struct someStruct {

    // someStruct内でのアクセスのみ許可したい
    private let privateProperty = "private"
    // sample.swift内でのアクセスを許可したい
    fileprivate let fileprivateProperty = "fileprivate"
}

// 同一ファイル内のextensionじゃないとアクセスできない
extension someStruct {

    // privateなプロパティ・メソッドにアクセス可能(Swift3ではできなかった)
    func printPrivateProperty() {
        print(privateProperty)
    }
}

// 意図通りのアクセスコントロールを実現できる
struct otherStruct {

    let some = someStruct()

    // someStruct外からはprivateにアクセス出来ない
    /*
    func printSomePrivateProperty() {
        print(some.privateProperty)
    }
     */

    // sample.swift内なのでfileprivatePropertyにアクセス可能
    func printSomeFileprivateProperty() {
        print(some.fileprivateProperty)
    }
}

注意

2017/6/18にXcode 9 betaで検証しています。
beta版なので変更の可能性があります。ご了承ください。

22
11
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?