07.クラスと構造体
25819 ワード
こうぞうたい
構造体は、構造化データと機能を作成することによって、カスタムデータ型を作成します.構造体の例は値タイプです.struct 구조체이름 {
프로퍼티(=멤버변수)와 메서드(=멤버함수)
}
構造体は別途作成者を作成する必要はありません.SWIFTはメンバー変数を自動的に参照して作成者を準備します.struct User {
// 멤버변수
var nickname: String
var age: Int
// 멤버함수
func info() {
print("\(nickname) is \(age)-year old")
}
}
var user = User(nickname: "Gunter", age: 35)
user.nickname
// "Gunter"
user.nickname = "Albert"
user.nickname
// "Albert"
user.info()
// "Albert is 35-year old"
カテゴリ
クラスも構造体と同様に、構造化データと機能を作成することでカスタムデータ型を作成します.ただし、クラスのインスタンスは、構造体とは異なり参照タイプです.class 클래스 이름 {
프로퍼티(=멤버변수)와 메서드(=멤버함수)
}
クラスは、構造体と同じ方法を使用して、インスタンスがメンバー変数とメンバー関数に自由にアクセスできるようにすることもできます.class Dog {
var name: String = ""
var age: Int = 0
func intro() {
print("The name is \(name), age is \(age)")
}
}
var dog = Dog()
dog.name = "Coco"
dog.age = 2
dog.intro()
// "The name is Coco, age is 2"
初期化
クラス、構造体、または列挙インスタンスを使用する操作を初期化と呼びます.一般にコンストラクション関数と呼ばれます.init(매개변수: 타입, ...) {
프로퍼티(=멤버변수) 초기화
인스턴스 생성시 필요한 설정 내용
}
初期化にはinit
構文を使用する必要があります.パラメータが変化するたびに、コンストラクション関数も存在します.class User {
var nickname: String
var age: Int
// 멤버변수 nickname, age를 모두 사용하는 생성자
init(nickname: String, age: Int) {
self.nickname = nickname
self.age = age
}
// 멤버변수 age만 사용하는 생성자
init(age: Int) {
self.nickname = "Albert"
self.age = age
}
}
var user = User(nickname: "Gunter", age: 35)
user.nickname
// "Gunter"
user.age
// 35
var user2 = User(age: 23)
user2.nickname
// "Albert"
user2.age
// 23
また,文法とは逆の文法(de-initializer)も存在する.これはinit
構文と呼ばれ、インスタンスがメモリに解放される前に呼び出され、コンストラクション関数として作成されたインスタンスとそのメンバー変数の値がnullの場合、すべて回収されます.したがって、これらのdeinit
構文は、「参照」メモリのクラス・インスタンス関係でのみ使用され、プログラマに必要なクリーンアップ操作が実現されます.class User {
var nickname: String
var age: Int
init(nickname: String, age: Int) {
self.nickname = nickname
self.age = age
}
init(age: Int) {
self.nickname = "Albert"
self.age = age
}
// de-initializer
deinit {
print("de-init user!")
}
}
var user3: User? = User(age: 10)
user3 = nil
// de-init user!
保証する
クラス、構造体、列挙タイプなどに関連する値で、インスタンスのプロパティを表します.
ストレージ構成
クラス、構造体、または列挙型で宣言される定数または変数.構造で定数として宣言されたストレージ・プロシージャは、インスタンスで値を変更できません.同様に、定数として宣言されたインスタンスは、ストレージ・プロシージャの値を変更できません.struct Dog {
// 구조체의 저장 프로퍼티 name, gender
var name: String
let gender: String
}
var dog = Dog(name: "Coco", gender: "male")
print(dog)
// Dog(name: "Coco", gender: "male")
dog.gender = "female"
// Cannot assign to property: 'gender' is a 'let' constant
let dog2 = Dog(name: "Kuku", gender: "male")
dog2.name = "Tata"
// Cannot assign to property: 'dog2' is a 'let' constant
逆に、クラスは参照タイプであり、定数として宣言されたインスタンスが変数型であっても、インスタンスはストレージ・プロシージャの値を変更できます.もちろん、構造と同様に、インスタンスは、最初に定数として宣言されたストレージ・プロシージャの値を任意に変更することはできません.class Cat {
// 클래스의 저장 프로퍼티 name, gender
var name: String
let gender: String
init(name: String, gender: String) {
self.name = name
self.gender = gender
}
}
let cat = Cat(name: "Latte", gender: "male")
cat.name = "Jason"
print(cat.name)
// "Jason"
えんざんプログラム
これは、GetterとSetterを使用して特定の演算を実行した結果値であり、特にインスタンスでのみ演算プログラムを実行する場合にgetter構文を自動的に実行する内容である.struct Stock {
var averagePrice: Int
var quantity: Int
// 구조체의 연산 프로퍼티
var purchasePrice: Int {
get {
return averagePrice * quantity
}
set(newPrice) {
averagePrice = newPrice / quantity
}
}
}
var stock = Stock(averagePrice: 2300, quantity: 3)
// 연산 프로퍼티 Getter를 활용한 경우
stock.purchasePrice
// 6900
// 연산 프로퍼티 Setter를 활용한 경우
stock.purchasePrice = 3000
stock.averagePrice
// 1000
職業オブザーバー
主に,Propertyの変更を注視して対応する結果を返す,deinit
OptiverとwillSet
Optiverが代表的である.class Account {
var credit: Int = 0 {
// 소괄호 이름 지정
willSet {
print("잔액이 \(credit)원에서 \(newValue)원으로 변경예정")
}
didSet {
print("잔액이 \(oldValue)원에서 \(credit)원으로 변경완료")
}
}
}
var account = Account()
account.credit = 1000
// "잔액이 0원에서 1000원으로 변경예정"
// "잔액이 0원에서 1000원으로 변경완료"
を選択します。
インスタンスを作成する必要がなく、オブジェクト内のPropertyにアクセスできます.初期段階でdidSet
キーワードを使用してPropertyを宣言すればいいです.struct SomeStructure {
// 스토어
static var storedTypeProperty = "Some value"
// 컴퓨티드
static var computedTypeProperty: Int {
return 1
}
}
SomeStructure.computedTypeProperty
// 1
SomeStructure.storedTypeProperty
// "Some value"
SomeStructure.storedTypeProperty = "hello"
SomeStructure.storedTypeProperty
// "hello"
クラスと構造体の違い
共通点
struct 구조체이름 {
프로퍼티(=멤버변수)와 메서드(=멤버함수)
}
struct User {
// 멤버변수
var nickname: String
var age: Int
// 멤버함수
func info() {
print("\(nickname) is \(age)-year old")
}
}
var user = User(nickname: "Gunter", age: 35)
user.nickname
// "Gunter"
user.nickname = "Albert"
user.nickname
// "Albert"
user.info()
// "Albert is 35-year old"
クラスも構造体と同様に、構造化データと機能を作成することでカスタムデータ型を作成します.ただし、クラスのインスタンスは、構造体とは異なり参照タイプです.
class 클래스 이름 {
프로퍼티(=멤버변수)와 메서드(=멤버함수)
}
クラスは、構造体と同じ方法を使用して、インスタンスがメンバー変数とメンバー関数に自由にアクセスできるようにすることもできます.class Dog {
var name: String = ""
var age: Int = 0
func intro() {
print("The name is \(name), age is \(age)")
}
}
var dog = Dog()
dog.name = "Coco"
dog.age = 2
dog.intro()
// "The name is Coco, age is 2"
初期化
クラス、構造体、または列挙インスタンスを使用する操作を初期化と呼びます.一般にコンストラクション関数と呼ばれます.init(매개변수: 타입, ...) {
프로퍼티(=멤버변수) 초기화
인스턴스 생성시 필요한 설정 내용
}
初期化にはinit
構文を使用する必要があります.パラメータが変化するたびに、コンストラクション関数も存在します.class User {
var nickname: String
var age: Int
// 멤버변수 nickname, age를 모두 사용하는 생성자
init(nickname: String, age: Int) {
self.nickname = nickname
self.age = age
}
// 멤버변수 age만 사용하는 생성자
init(age: Int) {
self.nickname = "Albert"
self.age = age
}
}
var user = User(nickname: "Gunter", age: 35)
user.nickname
// "Gunter"
user.age
// 35
var user2 = User(age: 23)
user2.nickname
// "Albert"
user2.age
// 23
また,文法とは逆の文法(de-initializer)も存在する.これはinit
構文と呼ばれ、インスタンスがメモリに解放される前に呼び出され、コンストラクション関数として作成されたインスタンスとそのメンバー変数の値がnullの場合、すべて回収されます.したがって、これらのdeinit
構文は、「参照」メモリのクラス・インスタンス関係でのみ使用され、プログラマに必要なクリーンアップ操作が実現されます.class User {
var nickname: String
var age: Int
init(nickname: String, age: Int) {
self.nickname = nickname
self.age = age
}
init(age: Int) {
self.nickname = "Albert"
self.age = age
}
// de-initializer
deinit {
print("de-init user!")
}
}
var user3: User? = User(age: 10)
user3 = nil
// de-init user!
保証する
クラス、構造体、列挙タイプなどに関連する値で、インスタンスのプロパティを表します.
ストレージ構成
クラス、構造体、または列挙型で宣言される定数または変数.構造で定数として宣言されたストレージ・プロシージャは、インスタンスで値を変更できません.同様に、定数として宣言されたインスタンスは、ストレージ・プロシージャの値を変更できません.struct Dog {
// 구조체의 저장 프로퍼티 name, gender
var name: String
let gender: String
}
var dog = Dog(name: "Coco", gender: "male")
print(dog)
// Dog(name: "Coco", gender: "male")
dog.gender = "female"
// Cannot assign to property: 'gender' is a 'let' constant
let dog2 = Dog(name: "Kuku", gender: "male")
dog2.name = "Tata"
// Cannot assign to property: 'dog2' is a 'let' constant
逆に、クラスは参照タイプであり、定数として宣言されたインスタンスが変数型であっても、インスタンスはストレージ・プロシージャの値を変更できます.もちろん、構造と同様に、インスタンスは、最初に定数として宣言されたストレージ・プロシージャの値を任意に変更することはできません.class Cat {
// 클래스의 저장 프로퍼티 name, gender
var name: String
let gender: String
init(name: String, gender: String) {
self.name = name
self.gender = gender
}
}
let cat = Cat(name: "Latte", gender: "male")
cat.name = "Jason"
print(cat.name)
// "Jason"
えんざんプログラム
これは、GetterとSetterを使用して特定の演算を実行した結果値であり、特にインスタンスでのみ演算プログラムを実行する場合にgetter構文を自動的に実行する内容である.struct Stock {
var averagePrice: Int
var quantity: Int
// 구조체의 연산 프로퍼티
var purchasePrice: Int {
get {
return averagePrice * quantity
}
set(newPrice) {
averagePrice = newPrice / quantity
}
}
}
var stock = Stock(averagePrice: 2300, quantity: 3)
// 연산 프로퍼티 Getter를 활용한 경우
stock.purchasePrice
// 6900
// 연산 프로퍼티 Setter를 활용한 경우
stock.purchasePrice = 3000
stock.averagePrice
// 1000
職業オブザーバー
主に,Propertyの変更を注視して対応する結果を返す,deinit
OptiverとwillSet
Optiverが代表的である.class Account {
var credit: Int = 0 {
// 소괄호 이름 지정
willSet {
print("잔액이 \(credit)원에서 \(newValue)원으로 변경예정")
}
didSet {
print("잔액이 \(oldValue)원에서 \(credit)원으로 변경완료")
}
}
}
var account = Account()
account.credit = 1000
// "잔액이 0원에서 1000원으로 변경예정"
// "잔액이 0원에서 1000원으로 변경완료"
を選択します。
インスタンスを作成する必要がなく、オブジェクト内のPropertyにアクセスできます.初期段階でdidSet
キーワードを使用してPropertyを宣言すればいいです.struct SomeStructure {
// 스토어
static var storedTypeProperty = "Some value"
// 컴퓨티드
static var computedTypeProperty: Int {
return 1
}
}
SomeStructure.computedTypeProperty
// 1
SomeStructure.storedTypeProperty
// "Some value"
SomeStructure.storedTypeProperty = "hello"
SomeStructure.storedTypeProperty
// "hello"
クラスと構造体の違い
共通点
init(매개변수: 타입, ...) {
프로퍼티(=멤버변수) 초기화
인스턴스 생성시 필요한 설정 내용
}
class User {
var nickname: String
var age: Int
// 멤버변수 nickname, age를 모두 사용하는 생성자
init(nickname: String, age: Int) {
self.nickname = nickname
self.age = age
}
// 멤버변수 age만 사용하는 생성자
init(age: Int) {
self.nickname = "Albert"
self.age = age
}
}
var user = User(nickname: "Gunter", age: 35)
user.nickname
// "Gunter"
user.age
// 35
var user2 = User(age: 23)
user2.nickname
// "Albert"
user2.age
// 23
class User {
var nickname: String
var age: Int
init(nickname: String, age: Int) {
self.nickname = nickname
self.age = age
}
init(age: Int) {
self.nickname = "Albert"
self.age = age
}
// de-initializer
deinit {
print("de-init user!")
}
}
var user3: User? = User(age: 10)
user3 = nil
// de-init user!
クラス、構造体、列挙タイプなどに関連する値で、インスタンスのプロパティを表します.
ストレージ構成
クラス、構造体、または列挙型で宣言される定数または変数.構造で定数として宣言されたストレージ・プロシージャは、インスタンスで値を変更できません.同様に、定数として宣言されたインスタンスは、ストレージ・プロシージャの値を変更できません.
struct Dog {
// 구조체의 저장 프로퍼티 name, gender
var name: String
let gender: String
}
var dog = Dog(name: "Coco", gender: "male")
print(dog)
// Dog(name: "Coco", gender: "male")
dog.gender = "female"
// Cannot assign to property: 'gender' is a 'let' constant
let dog2 = Dog(name: "Kuku", gender: "male")
dog2.name = "Tata"
// Cannot assign to property: 'dog2' is a 'let' constant
逆に、クラスは参照タイプであり、定数として宣言されたインスタンスが変数型であっても、インスタンスはストレージ・プロシージャの値を変更できます.もちろん、構造と同様に、インスタンスは、最初に定数として宣言されたストレージ・プロシージャの値を任意に変更することはできません.class Cat {
// 클래스의 저장 프로퍼티 name, gender
var name: String
let gender: String
init(name: String, gender: String) {
self.name = name
self.gender = gender
}
}
let cat = Cat(name: "Latte", gender: "male")
cat.name = "Jason"
print(cat.name)
// "Jason"
えんざんプログラム
これは、GetterとSetterを使用して特定の演算を実行した結果値であり、特にインスタンスでのみ演算プログラムを実行する場合にgetter構文を自動的に実行する内容である.
struct Stock {
var averagePrice: Int
var quantity: Int
// 구조체의 연산 프로퍼티
var purchasePrice: Int {
get {
return averagePrice * quantity
}
set(newPrice) {
averagePrice = newPrice / quantity
}
}
}
var stock = Stock(averagePrice: 2300, quantity: 3)
// 연산 프로퍼티 Getter를 활용한 경우
stock.purchasePrice
// 6900
// 연산 프로퍼티 Setter를 활용한 경우
stock.purchasePrice = 3000
stock.averagePrice
// 1000
職業オブザーバー
主に,Propertyの変更を注視して対応する結果を返す,
deinit
OptiverとwillSet
Optiverが代表的である.class Account {
var credit: Int = 0 {
// 소괄호 이름 지정
willSet {
print("잔액이 \(credit)원에서 \(newValue)원으로 변경예정")
}
didSet {
print("잔액이 \(oldValue)원에서 \(credit)원으로 변경완료")
}
}
}
var account = Account()
account.credit = 1000
// "잔액이 0원에서 1000원으로 변경예정"
// "잔액이 0원에서 1000원으로 변경완료"
を選択します。
インスタンスを作成する必要がなく、オブジェクト内のPropertyにアクセスできます.初期段階で
didSet
キーワードを使用してPropertyを宣言すればいいです.struct SomeStructure {
// 스토어
static var storedTypeProperty = "Some value"
// 컴퓨티드
static var computedTypeProperty: Int {
return 1
}
}
SomeStructure.computedTypeProperty
// 1
SomeStructure.storedTypeProperty
// "Some value"
SomeStructure.storedTypeProperty = "hello"
SomeStructure.storedTypeProperty
// "hello"
クラスと構造体の違い
共通点
static
内部値へのアクセス.
拡張機能extension
有効化機能差異
Protocol
を使用してクラスインスタンスのメモリ割当てを無効にできますclass SomeClass {
var count: Int = 0
}
struct SomeStruct {
var count: Int = 0
}
var class1 = SomeClass()
var class2 = class1
var class3 = class1
class3.count = 2
class1.count
// 2
var struct1 = SomeStruct()
var struct2 = struct1
var struct3 = struct1
struct2.count = 3
struct3.count = 4
struct1.count
// 0
Reference
この問題について(07.クラスと構造体), 我々は、より多くの情報をここで見つけました https://velog.io/@lattepapa/07.-클래스와-구조체テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol