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
以外はprivate
なextension
内にまとめる、ということもできますが。
アクセス出来てしまうこと自体がしっくりきませんでした。
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版なので変更の可能性があります。ご了承ください。