構文の切り替え:インスタンスの作成と削除
インスタンスの作成
定義
メソッド
class SomeClass{
init(){
}
}
struct SomeStruct{
init(){
}
}
enum SomeEnum{
case someCase
init(){
self = .selfCase
}
}
//클래스나 구조체는 init 이 비워있어도 되지만, 열거형은 초기화할 때 반드시 case 중 하나가 되어야 함
属性のデフォルト
struct Area{
var squareMeter: Double
init(){
squareMeter = 0.0 //Default Value 를 미리 작성하는 것
}
}
let room: Area = Area()
print(room.squareMeter) //0.0
**初期化後に不確定な値が存在しないストアド・プロシージャ→init()関数でデフォルト値を指定することもできますが、propertyで直接デフォルト値を指定することもできます.
struct Area{
var squareMeter: Double = 0.0
}
let room: Area = Area()
print(room.squareMether) //0.0
イニシャルRiserパラメータ(Parameters for Initializer)
struct Area{
var squareMeter: Double
init(fromPy py: Double){
squareMeter = py * 3.3
}
init(fromSquareMeter squareMeter: Double){
self.squareMeter = squareMeter
}
init(value: Double){
squareMeter = value
}
init(_ value: Double){
squareMeter = value
}
}
let roomOne: Area = Area(fromPy: 15.0)
let roomTwo: Area = Area(fromSquareMeter: 33.06)
→上記のように複数のイニシエータを使用できます.ファイバタイプ(Optional Property Type)
class Person{
var name: String
var age: Int?
init(name: String){
self.name = name
}
}
ていすうとくせい
**定数propertyは独自のクラスでのみ初期化→継承されたサブクラスでは定数propertyを初期化できません
class Person{
let name: String
var age: Int?
init(name: String){
self.name = name
}
}
let yagom: Person = Person(name: "yagom")
yagom.name = "Eric" //오류 발생!
デフォルトの頭文字RiserとメンバーワイルドカードInitializer
Default Initializer:
struct Point{
var x: Double = 0.0
var y: Double = 0.0
}
struct Size{
var width: Double = 0.0
var height: Double = 0.0
}
let point: Point = (x: 0, y: 0)
let size: Size = Size(width: 50.0, height: 50.0)
//위와 같이 매개변수로 프로퍼티의 이름과 할당할 값을 모두 포함하여 전달함.
let somePoint: Point = Point()
let someSize: Size = Size(width:50)
//width 에만 값을 할당하고 싶으면 그렇게 해도 됨
//그럼 자동으로 height 는 0.0 으로 초기화됨
let anotherPoint: Point = Point(y:100)
//위도 마찬가지
**Memberwise Initializerは構造体にのみ適用されます!クラスXイニシャル/委任の略語
Initializerは、インスタンスの初期化の一部を実行するために他の頭文字Lizerを呼び出すことができます.
→そのためには、2つのユーザ定義init()関数が必要
値タイプ(構造体、列挙)でのみ使用可能
クラスの初期化委任は継承されます
struct Frame {
var x: Int
var y: Int
init(x: Int, y: Int) {
self.x = x
self.y = y
}
init(y: Int) {
self.init(x: 0, y: y) // 다른 이니셜라이저를 호출
}
}
let rect = Frame(x: 10, y: 10)
let originRect = Frame(y: 5)
失敗する可能性のある頭文字Riser(Failable Initializer)
struct Animal {
let species: String
init?(species: String) {
if species.isEmpty { return nil } // nil 반환 시 return 사용
self.species = species
}
}
//init?을 옵셔널로 설정하였기에 nil 반환이 가능₩
//Animal? 도 옵셔널로 정의
if let animal: Animal? = Animal(species: "Dog"){
print(animal.species)
}
else{
print("error initializing")
}
//Dog
if let animal: Animal? = Animal(species: 2){
print(animal.species)
}
else{
print("error initializing")
}
//error initializing
enum Student: String{
case elementary = "초등학생", middle = "중학생", high = "고등학생"
init?(koreanAge: Int){
switch koreanAge{
case 8...13:
self = .elementary
case 14...16:
self = .middle
case 17...19:
self = .high
default:
return nil //이것도 init? () 으로 선언해서 가능한 것
}
}
init?(bornAt: Int, currentYear: Int){
self.init(koreanAge: currentYear - bornAt + 1) //초기화 위임!
}
}
var younger: Student? = Student(koreanAge: 25)
print(younger)
//nil
younger = Student(rawValue: "고등학생")
print(younger)
//high
モジュールまたは関数を使用してデフォルトの属性値を設定する
class SomeClass{
let someProperty: Int = {
return result
}()
}
//result 는 Int 와 반드시 같은 타입이어야 함
//즉, 반환 값의 타입은 동일
→モジュールの後ろに括弧()を付けるのは、モジュールを実行するためです.カッコを付けない場合、propertyのデフォルト値はモジュール自体です.struct Student{
var name: String?
var number: Int?
}
class SchoolClass{
var students: [Student] = {
//여기서 반환값은 반드시 [Student]이어야 한다
var arr: [Student] = [Student]()
for num in 1...15{
var student: Student = Student(name: nil, number: num) //하나씩 증가
arr.append(student)
}
}()
}
let myClass: SchoolClass = SchoolClass()
print(myClass.students.count)
//15
インスタンスの消失
→パラメータも括弧もない
→オートコールなので、個別のコードでは呼び出せません
class SomeClass{
deinit{
print("Instance will be deallocated")
}
}
var instance: SomeClass? = SomeClass()
instance = nil
→つまり、Denitコードを単独で実行するのではなく、instance=nil実行時にインスタンスが破棄され、破棄前にDenit{}が実行されます.ここでファイルを保存するか、ファイルを正しく閉じるなど、他の操作を実行できます.Reference
この問題について(構文の切り替え:インスタンスの作成と削除), 我々は、より多くの情報をここで見つけました https://velog.io/@kevinkim2586/스위프트-문법-인스턴스-생성-및-소멸テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol