Method
6518 ワード
//メソッド//「メソッドは特定のタイプに関連付けられた関数です.クラス、構造体、列挙はインスタンスメソッドを定義できます.インスタンスメソッドは、特定のタイプのインスタンスに対して特定のタスクと機能をカプセル化します.クラス、構造体、列挙はタイプメソッドを定義できます.タイプメソッドはタイプ自体に関連付けられます.タイプメソッドはObjective-Cのクラスメソッドに適用されます.(class methods)類似//「構造体と列挙の定義方法はSwiftとC/Objective-Cの主な違いの一つです.Objective-Cではクラスが唯一の定義方法のタイプです.ただしSwiftではクラス/構造体/列挙を定義するかどうかを選択するだけでなく、作成したタイプ(クラス/構造体/列挙)でも柔軟に方法を定義できます.」
//1.1インスタンスメソッド//「インスタンスメソッドは、特定のクラス、構造体、または列挙タイプのインスタンスに属するメソッドです.インスタンスメソッドは、インスタンスのプロパティにアクセスおよび変更するメソッドを提供するか、インスタンスの目的に関連する機能を提供し、インスタンスの機能をサポートします.インスタンスメソッドの構文は関数と完全に一致します//「インスタンス・メソッドは、その属するタイプの前後の括弧の間に書きます.インスタンス・メソッドは、その属するタイプの他のすべてのインスタンス・メソッドおよび属性に暗黙的にアクセスできます.インスタンス・メソッドは、その属するクラスの特定のインスタンスによってのみ呼び出されます.インスタンス・メソッドは、既存のインスタンスから離れて呼び出されません」
//「呼び出しプロパティと同様に、ポイント構文(dot syntax)でインスタンスメソッドを呼び出す」
//「関数パラメータには、ローカル名(関数ボディ内で使用)と外部名(関数呼び出し時に使用)を同時に使用できます.詳細は、外部パラメータ名の指定を参照してください.メソッドパラメータも同様です.メソッドは関数ですが、この関数はタイプに関連付けられています」
//1.2 selfプロパティ//「タイプの各インスタンスにはselfという暗黙的なプロパティがあります.selfはインスタンス自体と完全に同じです.この暗黙的なselfプロパティを使用して、インスタンスのインスタンスメソッドで現在のインスタンスを参照できます.」
//「コードにselfを頻繁に書く必要はありません.いつでも、1つのメソッドで既知の属性またはメソッド名を使用し、selfを明確に書かない場合は、現在のインスタンスの属性またはメソッドを指すと仮定します」//「このルールを使用する主なシーンは、インスタンスメソッドのパラメータ名がインスタンスの属性名と同じである場合です.この場合、パラメータ名は優先権を有し、属性を参照する際により厳密な方法を使用する必要があります.この場合、self属性を使用してパラメータ名と属性名を区別できます」
//1.3インスタンスメソッドで値タイプ//「構造体と列挙は値タイプです.デフォルトでは、値タイプのプロパティはインスタンスメソッドでは変更できません」//「特定のメソッドで構造体または列挙のプロパティを変更する必要がある場合は、このメソッドの可変(mutating)を選択できます.動作は、メソッドの内部からプロパティを変更することができます.このメソッドの変更は、メソッドの実行が終了すると元の構造に戻ります.メソッドは、メソッドの終了時に既存のインスタンスを置き換える、隠されたselfプロパティに新しいインスタンスを与えることもできます.」
//「上記のPoint構造体は、新しいポイントを返すのではなく、ポイントインスタンスを所定の場所に移動するための可変メソッドmoveByX(:y:)を定義しています.メソッドが呼び出されたときに、このポイントが変更されました.メソッド定義にmutatingキーワードが追加され、属性の変更が許可されます.」
//「構造体タイプの定数(a constant of structure type)では、属性が変数属性であっても変更できないため、可変メソッドは使用できません.」
//1.4構造体と列挙タイプ可変メソッドでselfに//「可変メソッドは隠し属性selfに新しいインスタンスを割り当てることができる」
//「新しい可変メソッドmoveBy(x:y:)は、xとyの値がターゲット値に設定された新しい構造体インスタンスを作成しました.このバージョンを呼び出す方法と、前のバージョンを呼び出す最終結果は同じです」
//「列挙の可変メソッドselfを同じ列挙タイプの異なるメンバーに設定できます:」
//2.タイプ・メソッド//「インスタンス・メソッドは、あるタイプのインスタンスによって呼び出されるメソッドです.タイプ自体で呼び出されるメソッドを定義することもできます.このメソッドをタイプ・メソッドと呼びます.メソッドのfuncキーワードの前にキーワードstaticを付けて、タイプ・メソッドを指定します.クラスは、親のメソッドの書き換えをキーclassで許可することもできます」//注意:「Objective-Cでは、Objective-Cのクラスタイプ(classes)に対してのみタイプメソッド(type-level methods)を定義できます.Swiftでは、すべてのクラス、構造体、列挙に対してタイプメソッドを定義できます.各タイプメソッドは、サポートされているタイプ明示的なパッケージに含まれています」
//「タイプメソッドのメソッドボディ(body)では、selfはタイプのインスタンスではなく、このタイプ自体を指します.これは、selfを使用してタイププロパティとタイプメソッドパラメータの曖昧さを解消できることを意味します(インスタンスプロパティとインスタンスメソッドパラメータを前に処理したときのように)」
//タイプメソッドのメソッドボディでは、本クラスの他のタイプメソッドおよびタイププロパティによって参照できる、限定されていないメソッドおよびプロパティ名.1つのタイプメソッドは、メソッド名の前にタイプ名を付けることなく、タイプメソッドの名前からクラス内の他のタイプメソッドを直接呼び出すことができます.同様に、構造体および列挙では、タイプ名を付けて迂回する必要がなく、タイプ属性の名前からクラス内のタイプ属性に直接アクセスすることもできる.
//「シングルゲームですが、同じデバイス上で複数のプレイヤーのゲーム情報を格納することもできます.ゲームの初期段階では、すべてのゲームレベル(レベル1を除く)はロックされている.プレイヤーが1つのレベルを完了するたびに、このレベルはこのデバイス上のすべてのプレイヤーに対してロックを解除する.LevelTracker構造体はタイプ属性と方法でゲームのどのレベルがロック解除されたかを監視する.また、各プレイヤーの現在のレベルを監視する」
//1.1インスタンスメソッド//「インスタンスメソッドは、特定のクラス、構造体、または列挙タイプのインスタンスに属するメソッドです.インスタンスメソッドは、インスタンスのプロパティにアクセスおよび変更するメソッドを提供するか、インスタンスの目的に関連する機能を提供し、インスタンスの機能をサポートします.インスタンスメソッドの構文は関数と完全に一致します//「インスタンス・メソッドは、その属するタイプの前後の括弧の間に書きます.インスタンス・メソッドは、その属するタイプの他のすべてのインスタンス・メソッドおよび属性に暗黙的にアクセスできます.インスタンス・メソッドは、その属するクラスの特定のインスタンスによってのみ呼び出されます.インスタンス・メソッドは、既存のインスタンスから離れて呼び出されません」
class Counter{
var count = 0
func increment(){
count += 1
}
func increment(by amount:Int){
count += amount
}
func reset(){
count = 0
}
}
//「呼び出しプロパティと同様に、ポイント構文(dot syntax)でインスタンスメソッドを呼び出す」
let counter = Counter()
counter.increment() //1
counter.increment(by: 5) //6
counter.reset() //0
//「関数パラメータには、ローカル名(関数ボディ内で使用)と外部名(関数呼び出し時に使用)を同時に使用できます.詳細は、外部パラメータ名の指定を参照してください.メソッドパラメータも同様です.メソッドは関数ですが、この関数はタイプに関連付けられています」
//1.2 selfプロパティ//「タイプの各インスタンスにはselfという暗黙的なプロパティがあります.selfはインスタンス自体と完全に同じです.この暗黙的なselfプロパティを使用して、インスタンスのインスタンスメソッドで現在のインスタンスを参照できます.」
class SelfConter{
var count = 0
func increment() {
self.count += 1
}
}
//「コードにselfを頻繁に書く必要はありません.いつでも、1つのメソッドで既知の属性またはメソッド名を使用し、selfを明確に書かない場合は、現在のインスタンスの属性またはメソッドを指すと仮定します」//「このルールを使用する主なシーンは、インスタンスメソッドのパラメータ名がインスタンスの属性名と同じである場合です.この場合、パラメータ名は優先権を有し、属性を参照する際により厳密な方法を使用する必要があります.この場合、self属性を使用してパラメータ名と属性名を区別できます」
struct Point {
var x = 0.0,y = 0.0
func isToRightOfX(x:Double) -> Bool {
return self.x > x
}
}
let somePoint = Point(x:4.0,y:5.0)
if somePoint.isToRightOfX(x: 1.0) {
print("this point is to the right of the line where x == 1.0")
}
// this point is to the right of the line where x == 1.0
//“ self ,Swift x x 。”
//1.3インスタンスメソッドで値タイプ//「構造体と列挙は値タイプです.デフォルトでは、値タイプのプロパティはインスタンスメソッドでは変更できません」//「特定のメソッドで構造体または列挙のプロパティを変更する必要がある場合は、このメソッドの可変(mutating)を選択できます.動作は、メソッドの内部からプロパティを変更することができます.このメソッドの変更は、メソッドの実行が終了すると元の構造に戻ります.メソッドは、メソッドの終了時に既存のインスタンスを置き換える、隠されたselfプロパティに新しいインスタンスを与えることもできます.」
struct StructPoint{
var x = 0.0, y = 0.0
mutating func moveByX(deltaX:Double, y deltaY:Double){
x += deltaX
y += deltaY
}
}
var structSomePoint = StructPoint(x:1.0,y:1.0)
structSomePoint.moveByX(deltaX: 2.0, y: 3.0)
print("the point is now at \(structSomePoint.x,structSomePoint.y)")
// the point is now at (3.0, 4.0)
//「上記のPoint構造体は、新しいポイントを返すのではなく、ポイントインスタンスを所定の場所に移動するための可変メソッドmoveByX(:y:)を定義しています.メソッドが呼び出されたときに、このポイントが変更されました.メソッド定義にmutatingキーワードが追加され、属性の変更が許可されます.」
//「構造体タイプの定数(a constant of structure type)では、属性が変数属性であっても変更できないため、可変メソッドは使用できません.」
let fixedPoint = StructPoint(x:3.0,y:3.0)
//fixedPoint.moveByX(deltaX: 2.0, y: 3.0)
//1.4構造体と列挙タイプ可変メソッドでselfに//「可変メソッドは隠し属性selfに新しいインスタンスを割り当てることができる」
struct anotherStructPoint {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX:Double,y deltaY:Double){
self = anotherStructPoint(x:x+deltaX,y:y+deltaY)
}
}
//「新しい可変メソッドmoveBy(x:y:)は、xとyの値がターゲット値に設定された新しい構造体インスタンスを作成しました.このバージョンを呼び出す方法と、前のバージョンを呼び出す最終結果は同じです」
//「列挙の可変メソッドselfを同じ列挙タイプの異なるメンバーに設定できます:」
enum TriStateSwitch{
case Off, Low , High
mutating func next(){
switch self {
case .Off:
self = .Low
case .Low:
self = .High
case .High:
self = .Off
}
}
}
var ovenLight = TriStateSwitch.Low
//ovenLight .Higt
ovenLight.next()
//ovenLight .Off
//“ 。 next() , (Off,Low,High) ”
//2.タイプ・メソッド//「インスタンス・メソッドは、あるタイプのインスタンスによって呼び出されるメソッドです.タイプ自体で呼び出されるメソッドを定義することもできます.このメソッドをタイプ・メソッドと呼びます.メソッドのfuncキーワードの前にキーワードstaticを付けて、タイプ・メソッドを指定します.クラスは、親のメソッドの書き換えをキーclassで許可することもできます」//注意:「Objective-Cでは、Objective-Cのクラスタイプ(classes)に対してのみタイプメソッド(type-level methods)を定義できます.Swiftでは、すべてのクラス、構造体、列挙に対してタイプメソッドを定義できます.各タイプメソッドは、サポートされているタイプ明示的なパッケージに含まれています」
class SomeClass{
static func someTypeMethod(){
//
print(" ")
}
class func otherTypeMethod(){
//
print(" ")
}
}
SomeClass.someTypeMethod()
SomeClass.otherTypeMethod()
//「タイプメソッドのメソッドボディ(body)では、selfはタイプのインスタンスではなく、このタイプ自体を指します.これは、selfを使用してタイププロパティとタイプメソッドパラメータの曖昧さを解消できることを意味します(インスタンスプロパティとインスタンスメソッドパラメータを前に処理したときのように)」
//タイプメソッドのメソッドボディでは、本クラスの他のタイプメソッドおよびタイププロパティによって参照できる、限定されていないメソッドおよびプロパティ名.1つのタイプメソッドは、メソッド名の前にタイプ名を付けることなく、タイプメソッドの名前からクラス内の他のタイプメソッドを直接呼び出すことができます.同様に、構造体および列挙では、タイプ名を付けて迂回する必要がなく、タイプ属性の名前からクラス内のタイプ属性に直接アクセスすることもできる.
//「シングルゲームですが、同じデバイス上で複数のプレイヤーのゲーム情報を格納することもできます.ゲームの初期段階では、すべてのゲームレベル(レベル1を除く)はロックされている.プレイヤーが1つのレベルを完了するたびに、このレベルはこのデバイス上のすべてのプレイヤーに対してロックを解除する.LevelTracker構造体はタイプ属性と方法でゲームのどのレベルがロック解除されたかを監視する.また、各プレイヤーの現在のレベルを監視する」
struct LevelTracker{
static var highesUnlockedLevel = 1
var currentLevel = 1
static func unlock(_ level:Int){
if level > highesUnlockedLevel {
highesUnlockedLevel = level
}
}
static func isUnlocked(_ level:Int)->Bool{
return level <= highesUnlockedLevel
}
mutating func advance(to level :Int)->Bool{
if LevelTracker.isUnlocked(level) {
currentLevel = level
return true
}else{
return false
}
}
}
class Player{
var tracker = LevelTracker()
let playerName:String
func complete(level:Int) {
LevelTracker.unlock(level+1)
tracker.advance(to: level+1)
}
init(name:String) {
playerName = name
}
}
var player1 = Player(name:"Argyrios")
player1.complete(level: 1)
print("highest unlock level is now \(LevelTracker.highesUnlockedLevel) ")
// highest unlock level is now 2
var player2 = Player(name:"Bob")
if player2.tracker.advance(to: 6) {
print("player is now on level 6")
}else{
print("level 6 has not yet been unlocked")
}
// level 6 has not yet been unlocked