[Swift 문법] - 구조체 (Struct)

sun02·2021년 7월 15일
0

100 days of Swift 

목록 보기
7/40

1. Creating your own structs

Swift에서는 사용자의 고유한 타입을 두 가지 방식으로 선언할 수 있고 그 중 가장 일반적인 방법은 structs 라고 불린다.
Struct는 자신만의 변수와 상수, 함수를 가질 수 있고 원하는 대로 만들고 사용될 수 있다.

Struct Sport {
     var name: String
}
  • 이름을 문자열로 저장하는 Sport 구조체이다.
  • 구조체 안의 변수들은 프로퍼티라고 불리기 때문에 이것은 한 개의 프로퍼티를 가지는 구조체이다.
var tennis = Sport(name: “Tennis”)
print(tennis.name)
  • struct가 타입을 정의하기 때문에 instance를 생성하고 사용할 수 있다.
tennis.name = “Lawn tennis”
  • name 과 tennis 두 개 다 변수로 만들었기 때문에 일반 변수처럼 변화시킬 수 있다.

2. Computed properties

Swift에는

  • computed property(계산된 프로퍼티) – 값을 알아내기위해 코드 실행
  • stored properties (저장된 프로퍼티)
    가 있다.
struct Sport {
    var name: String
}
  • sport구조체는 문자열을 저장하는 name 프로퍼티를 가지고 이것은 stored property이다.

Sport 구조체에 다른 저장된 프로퍼티를 추가하고 계산된 프로퍼티를 추가할 것이다.

struct Sport {
    var name : String
    var isOlympicSport: Bool

    var olympicStatus: String {
       if isOlympicSport {
           return “\(name) is an Olympic sport”
       } else {
           Return “\(name) is not an Olympic sport”
       }
    }
}
  • olympicStatus는 일반 문자열처럼 보이지만 상대 프로퍼티에 따라 다른 값을 반환하므로 computed property이다.
let chessBoxing = Sport(name: “Chessboxing”, isOlympicSport: false)
print(chessBoxing.olympicStatus)
  • Sport의 새로운 인스턴스를 만들어 다음과 같이 시도해볼 수 있다.

3. Property observers

property observer는 프로퍼티가 변화하기 전이나 후에 코드를 실행할 수 있게 한다.

struct Progress {
    var task: String
    var amount: Int 
}
  • track과 완성율을 추적하는 Progress 구조체이다.
var progress = Progress(task:”Loading data”, amount: 0)
progress.amount = 30
progress.amount = 80
progress.amount = 100
  • 위 구조체의 인스턴스를 만들고 시간이 지남에 따라 진행 상황을 조정할 수 있다.

Swift가 amount가 변화할 때마다 메시지를 출력하기 위해 didSet 프로퍼티 옵져버를 사용한다.

struct Progress {
    var task: String
    var amount : Int {
         didSet {
             print(“\(task) is now \(amount)% complete”)
         }
    }
}
  • 이것은 amount가 변화할 때마다 해당 코드를 실행시킨다.

너는 프로퍼티가 변경되기 전에 작동하는 willSet도 사용할 수 있지만 이것은 거의 사용되지 않는다.

4. Methods

구조체는 내부에 함수를 가질 수 있고 이 함수들은 필요시 구조체의 프로퍼티들도 사용할 수 있다.
구조체 안의 함수들은 methods라고 불리지만 똑같이 func 키워드를 사용한다.

struct City {
    var population : Int
    
    func collectTaxes() -> Int {
         return population * 1000
    }
}
  • population 프로퍼티와 collectTaxes() 메서드를 가지는 City구조체이다.
  • collectTaxes() 메서드는 City안에 속해있기 때문에 현재 도시의 population 프로퍼티를 읽을 수 있다.
let London = City(population:9_000_000)
london.collectTaxes()
  • collectTaxes() 메서드는 City에 속하므로 이 구조체의 인스턴스에서 다음과 같이 호출한다.

5. Mutating methods

구조체가 변수 프로퍼티를 가지지만 인스턴스는 상수로 생성되는 경우,
프로퍼티는 변경될 수 없다. – 그 구조체는 상수이므로 무엇으로 생성되었는지에 관계없이 구조체의 모든 프로퍼티들 또한 상수이다.

구조체를 생성할 때 Swift는 이 구조체를 상수로 사용할 지 변수로 사용할 지 모르기 때문에 디폴트로 안전한 접근 방식을 취한다.
: swift는 구체적으로 요구(mutating)하지 않는 이상 프로퍼티를 변경시키는 매서드를 작성할 수 없게 한다.

struct Person {
    var name: String

    mutating func make Anonymous() {
          name = “Anonymous”
    }
}
  • 매서드 안에서 프로퍼티를 변경시키고 싶다면 mutating 키워드를 사용해서 나타내야한다.
var person = Person(name:”Ed”)
person.makeAnonymous()
  • 또한 이 메서드는 프로퍼티를 변경시키기 때문에 변수 Person 인스턴스에서만 호출되도록 한다.

6. Properties and methods of strings

여태까지 많은 문자열들을 사용해왔고 그들은 – 문자열을 조회하고 조작할 때 사용하는 고유한 매서드와 프로퍼티를 가지는 - 구조체라고 밝혀졌다.

let string = “Do or not, there is no try.”
  • 먼저 테스트용 문자열을 만들어 보자
print(string.count)
  • count 프로퍼티를 사용해서 문자열의 문자 개수를 읽을 수 있다.
print(string.hasPrefix(“Do”))
  • 특정 문자로 시작하면 true를 반환하는 hasPrefix() 매서드
print(string.uppercased())
  • Uppercased() 매서드를 호출해서 문자열을 대문자로 바꿀 수 있다.
print(string.sorted())
  • 또한 문자열의 문자들을 배열로 정렬하도록 할 수도 있다.

문자열은 매우 다양한 프로퍼티와 매서드를 갖고 있다.

7. Properties and method of arrays

배열도 마찬가지로 구조체이다.
이는 배열도 그들만의 매서드와 프로퍼티를 가지고 이것들을 사용하여 배열을 조회하고 조작할 수 있다는 것을 의미한다.

var toys = [“Woody”]
  • 여기 시작할 간단한 배열이 있다.
print(toys.count)
  • Count 프로퍼티를 사용해서 배열의 항목 갯수를 알 수 있다.
toys.append(“Buzz”)
  • 새 항목을 추가하고 싶으면 append() 매서드를 다음과 같이 사용할 수 있다.
toys.firstIndex(of: “Buzz”)
  • firstIndex()를 사용해서 배열 내의 모든 항목을 찾을 수 있다.
  • 배열은 0부터 세어지기 때문에 1을 반환할 것이다.
print(toys.sorted())
  • 문자열처럼 스위프트는 배열의 항목들을 알파벳 순서로 정렬할 수 있다.
toys.remove(at: 0)
  • 항목을 삭제하고 싶다면 remove() 매서드를 사용한다.

배열에도 매우 많은 프로퍼티와 매서드가 있다.

출처

0개의 댓글