https://github.com/kodecocodes/swift-algorithm-club

 

GitHub - kodecocodes/swift-algorithm-club: Algorithms and data structures in Swift, with explanations!

Algorithms and data structures in Swift, with explanations! - GitHub - kodecocodes/swift-algorithm-club: Algorithms and data structures in Swift, with explanations!

github.com

 

정의 

구조체와 클래스의 정의 구문은 비슷합니다. struct키워드로 구조를 소개하고 키워드로 클래스를 소개합니다 class. 둘 다 한 쌍의 중괄호 안에 전체 정의를 배치합니다.

struct SomeStructure {
    // structure definition goes here
}
class SomeClass {
    // class definition goes here
}

 

EX)

struct Resolution {
    var width = 0
    var height = 0
}
class VideoMode {
    var resolution = Resolution()
    var interlaced = false
    var frameRate = 0.0
    var name: String?
}

 

인스턴스를 생성하는 구문은 구조체와 클래스 모두 매우 유사합니다.

let someResolution = Resolution()
let someVideoMode = VideoMode()

 

 

모든 구조체에는 자동으로 생성된 멤버 단위 초기화가 있으며 이를 사용하여 새 구조체 인스턴스의 멤버 속성을 초기화할 수 있습니다. 새 인스턴스의 속성에 대한 초기 값은 이름으로 멤버별 이니셜라이저에 전달될 수 있습니다.

let vga = Resolution(width: 640, height: 480)

구조체와 달리 클래스 인스턴스는 기본 멤버 단위 초기화를 받지 않습니다. (초기화 initialization)

 

 

클래스는 참조 유형입니다.

값 유형과 달리 참조 유형은 변수나 상수에 할당되거나 함수에 전달될 때 복사되지 않습니다 . 복사본이 아니라 동일한 기존 인스턴스에 대한 참조가 사용됩니다.

let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0

frameRate를 30으로 바꿈

let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0

 

 

 

 

 

 

 

 

import UIKit

struct Town{
    //프로퍼티
    let name = "Angelaland"
    var citizens = ["Angela", "Jack Bauer"]
    var resources = ["Gain" : 100, "Ore" :42, "Wool" : 75]
    
    //구조체 안의 리턴값 없는 메서드(구조체나 클래스 안에서의 정의)
    //독립실행형이고 어디선가 자유롭게 사용된다면 함수라고 정의 따라서 fortify는 메서드
    func fortify(){
        print ("Defences increased!")
    }
}


var myTown = Town() //Town개체를 myTown으로 사용

print(myTown.name) // 구조체의 name 출력
print("\(myTown.name) has \(myTown.resources["Gain"]!) bags of grain.")

myTown.citizens.append("Smith") //moTown의 citizens에 Smith추가
print(myTown.citizens.count) //citizens의 개수 출력

myTown.fortify()



//init사용
struct Town_initCase{
    //프로퍼티
    let name : String
    var citizens : [String]
    var resources : [String : Int]
    
    init(name : String, citizens : [String], resources : [String:Int]){
        self.name = name
        self.citizens = citizens
        self.resources = resources
    }
    
    //구조체 안의 리턴값 없는 메서드(구조체나 클래스 안에서의 정의)
    //독립실행형이고 어디선가 자유롭게 사용된다면 함수라고 정의 따라서 fortify는 메서드
    func fortify(){
        print ("Defences increased!")
    }
}

//init으로 Town_initCase 구조체 초기화
var anotherTown = Town_initCase(name: "Nameless Island", citizens: ["Tom"], resources: ["Coconuts" : 100])
anotherTown.citizens.append("Wilson")
print(anotherTown.citizens)

 

 

 

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/classesandstructures#Definition-Syntax

 

Documentation

 

docs.swift.org

 

'iOS > Swift문법' 카테고리의 다른 글

Swift 알고리즘 클럽  (0) 2023.06.30
Swift 기본문법) 특수문자 출력  (0) 2023.06.17
Swift 기본문법) 컬렉션 타입  (0) 2022.09.05
Swift 기본문법) 기본 데이터 타입  (1) 2022.08.31
Swift 기본문법) 상수와 변수  (1) 2022.08.30

 

특수한 문자열을 출력하려면 양끝에 #을 붙여주면된다.

import Foundation

print(#"!@#$%^&*(\'"<>?:;"#)
//!@#$%^&*(\'"<>?:; 그대로 출력됨.

 

 

 

 

Array

-Array는 멤버가 순서(인덱스)를 가진 리스트 형태의 컬렉션 타입입니다.

// 빈 Int Array 생성
var integers: Array<Int> = Array<Int>()

// 같은 표현
// var integers: Array<Int> = [Int]()
// var integers: Array<Int> = []
// var integers: [Int] = Array<Int>()
// var integers: [Int] = [Int]()
// var integers: [Int] = []
// var integers = [Int]()
Array 활용

integers.append(1)
integers.append(100)

// Int 타입이 아니므로 Array에 추가할 수 없습니다
//integers.append(101.1)

print(integers)	// [1, 100]

// 멤버 포함 여부 확인
print(integers.contains(100)) // true
print(integers.contains(99)) // false

// 멤버 교체
integers[0] = 99

// 멤버 삭제
integers.remove(at: 0)
integers.removeLast()
integers.removeAll()

// 멤버 수 확인
print(integers.count)

// 인덱스를 벗어나 접근하려면 익셉션 런타임 오류발생
//integers[0]

let을 이용하여 Array를 선언하면 불변 Array가 됩니다.

let immutableArray = [1, 2, 3]

// 수정이 불가능한 Array이므로 멤버를 추가하거나 삭제할 수 없습니다
//immutableArray.append(4)
//immutableArray.removeAll()

 

Dictionary

-Dictionary는 키 와 값 의 쌍으로 이루어진 컬렉션 타입입니다.

// Key가 String 타입이고 Value가 Any인 빈 Dictionary 생성
var anyDictionary: Dictionary<String, Any> = [String: Any]()

// 같은 표현
// var anyDictionary: Dictionary <String, Any> = Dictionary<String, Any>()
// var anyDictionary: Dictionary <String, Any> = [:]
// var anyDictionary: [String: Any] = Dictionary<String, Any>()
// var anyDictionary: [String: Any] = [String: Any]()
// var anyDictionary: [String: Any] = [:]
// var anyDictionary = [String: Any]()

-Dictionary 활용

// 키에 해당하는 값 할당
anyDictionary["someKey"] = "value"
anyDictionary["anotherKey"] = 100

print(anyDictionary) // ["someKey": "value", "anotherKey": 100]

// 키에 해당하는 값 변경
anyDictionary["someKey"] = "dictionary"
print(anyDictionary) ["someKey": "dictionary", "anotherKey": 100]

// 키에 해당하는 값 제거
anyDictionary.removeValue(forKey: "anotherKey")
anyDictionary["someKey"] = nil
print(anyDictionary)

-let을 사용하여 Dictionary를 선언하면 불변 Dictionary가 됩니다.

let emptyDictionary: [String: String] = [:]
let initalizedDictionary: [String: String] = ["name": "yagom", "gender": "male"]

// 불변 Dictionary이므로 값 변경 불가
//emptyDictionary["key"] = "value"

 

-키의 해당하는 값을 다른 변수나 상수에 할당하고자 할때는 옵셔널 타입 캐스팅 파트에서 다룹니다.

// "name"이라는 키에 해당하는 값이 없을 수 있으므로 
// String 타입의 값이 나올 것이라는 보장이 없습니다.
// 컴파일 오류가 발생합니다
let someValue: String = initalizedDictionary["name"]

Set

-Set은 순서가 없고, 멤버가 유일한 것을 보장하는 컬렉션 타입입니다.

 

-Set의 선언과 생성

// 빈 Int Set 생성
var integerSet: Set<Int> = Set<Int>()
integerSet.insert(1)
integerSet.insert(100)
integerSet.insert(99)
integerSet.insert(99)
integerSet.insert(99)

print(integerSet) // [100, 99, 1]
print(integerSet.contains(1)) // true
print(integerSet.contains(2)) // false

integerSet.remove(100)
integerSet.removeFirst()

print(integerSet.count) // 1
Set는 집합연산에 많이 활용됩니다

// Set는 집합 연산에 꽤 유용합니다
let setA: Set<Int> = [1, 2, 3, 4, 5]
let setB: Set<Int> = [3, 4, 5, 6, 7]

// 합집합
let union: Set<Int> = setA.union(setB)
print(union) // [2, 4, 5, 6, 7, 3, 1]

// 합집합 오름차순 정렬
let sortedUnion: [Int] = union.sorted()
print(sortedUnion) // [1, 2, 3, 4, 5, 6, 7]

// 교집합
let intersection: Set<Int> = setA.intersection(setB)
print(intersection) // [5, 3, 4]

// 차집합
let subtracting: Set<Int> = setA.subtracting(setB)
print(subtracting) // [2, 1]

 

생각해보기!

다음과 같은 경우에는 각각 어떤 컬렉션 타입을, 상수/변수 선언 중 어떤 것을 사용하면 유용할지 생각해 봅시다.

  • 영어 알파벳 소문자를 모아두는 컬렉션 >> Array
  • 책의 제목과 저자 정리를 위한 컬렉션 >> Dictionary
  • 우리반 학생 명부 작성을 위한 컬렉션 >> Set?

 

https://blog.yagom.net/

 

yagom's blog

야곰의 프로그래밍 블로그입니다. iOS, Swift, Objective-C, C에 대해 이야기합니다.

blog.yagom.net

 

- 모든 데이터 타입의 이름은  첫 글자를 대문자로 입력한다. 

- 모든 데이터 타입(IntFloatDoubleBoolStringArrayDictionarySet 등)은 모두 Struct (구조체)를 기반으로 구현되어 있다.

(쉽게 설명하자면, 우리가 숫자를 표현하고 싶을 때 Int 라고 입력해서 바로 사용할 수 있도록 Swift에 미리 구조체 라는 것으로 만들어져 있다는 의미)

<-> Reference Type : class, function, closure 등

- 스위프트는 데이터 타입 엄격하게 관리하므로 암시적으로 이루어지는 데이터 타입의 변형으로부터 일어날 수 있는 예기치 않은 결과를 일으키는 경우를 방지해야 한다.

Bool

- true 와 false 만을 값으로 가지는 타입

var someBool: Bool = true
someBool = false
// someBool = 0 // 컴파일 오류발생
// someBool = 1 // 컴파일 오류발생

 

Int , UInt

- Int : 정수 타입. 현재는 기본적으로 64비트 정수형.

var someInt: Int = -100
// someInt = 100.1 // 컴파일 오류발생

 

-UInt : 양의 정수 타입. 현재는 기본적으로 64비트 양의 정수형

var someUInt: UInt = 100
// someUInt = -100 // 컴파일 오류발생
// someUInt = someInt // 컴파일 오류발생

 

Float, Double

-Float : 실수 타입. 32비트 부동소수형

var someFloat: Float = 3.14
someFloat = 3

-Double : 실수 타입. 64비트 부동소수형

var someDouble: Double = 3.14
someDouble = 3
// someDouble = someFloat // 컴파일 오류발생

 

Character, String

- Character : 문자 타입. 유니코드 사용. 큰따옴표("") 사용.

var someCharacter: Character = "🇰🇷"
someCharacter = "😄"
someCharacter = "가"
someCharacter = "A"
// someCharacter = "하하하" // 컴파일 오류발생
print(someCharacter)

-String : 문자열 타입. 유니코드 사용. 큰따옴표("") 사용.

var someString: String = "하하하 😄 "
someString = someString + "웃으면 복이와요"
print(someString)

// someString = someCharacter // 컴파일 오류발생

여러줄 문자열은 큰따옴표 세 개 사용.

someString = """
여러줄 문자열을
사용할 수 있습니다.
첫 줄에 겹따옴표 세 개,
마지막 줄에 겹따옴표 세 개를
사용하면 됩니다.
"""

someString = """
겹따옴표 세 개인 줄(첫줄, 끝줄)에서
줄 바꿈을 하지 않으면 오류가 발생합니다.
"""

/*
someString = """오류발생
오류발생"""
*/

 

생각해보기

let integer = 100 //정수형 Int Type
let floatingPoint = 12.34 // 실수형 Double Type
let apple = "A" // String

print(type(of: integer)) //Int
print(type(of: floatingPoint)) // Double
print(type(of: apple)) //String

 

Any

-swift의 모든 타입을 지칭하는 키워드

var someAny: Any = 100
someAny = "어떤 타입도 수용 가능합니다"
someAny = 123.12

Any 타입에 Double 자료를 넣어두었더라도 Any는 Double 타입이 아니기 때문에 할당할 수 없습니다.

명시적으로 타입을 변환해 주어야 합니다.

타입 변환은 차후에~

let someDouble: Double = someAny  // 컴파일 오류발생

AnyObject

모든 클래스 타입을 지칭하는 프로토콜(클래스와 프로토콜은 차후에~)

class SomeClass {}

var someAnyObject: AnyObject = SomeClass()

AnyObject는 클래스의 인스턴스만 수용 가능하기 때문에 클래스의 인스턴스가 아니면 할당할 수 없습니다.

someAnyObject = 123.12    // 컴파일 오류발생

nil

없음을 의미하는 키워드

다른 언어의 NULL, Null, null 등과 유사한 표현입니다.

 

아래 코드에서 someAny는 Any타입이고, someAnyObject는 AnyObject타입 이기 때문에

nil을 할당할 수 없습니다.

nil다루기는 옵셔널에서~

someAny = nil         // 컴파일 오류발생
someAnyObject = nil   // 컴파일 오류발생

 

 

 

도움주신 분들!

 

https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html

 

The Basics — The Swift Programming Language (Swift 5.7)

The Basics Swift is a new programming language for iOS, macOS, watchOS, and tvOS app development. Nonetheless, many parts of Swift will be familiar from your experience of developing in C and Objective-C. Swift provides its own versions of all fundamental

docs.swift.org

 

https://lxxyeon.tistory.com/

 

👩🏻‍💻 테크연

 

lxxyeon.tistory.com

https://blog.yagom.net/

 

yagom's blog

야곰의 프로그래밍 블로그입니다. iOS, Swift, Objective-C, C에 대해 이야기합니다.

blog.yagom.net

 

- 상수 선언 키워드 let

- 변수 선언 키워드 var

let 이름 : 타입 = 값
var 이름 : 타입 = 값
let constant: String = "차후에 변경이 불가능한 상수 let" //immutable
var variable: String = "차후에 변경이 가능한 변수 var" //mutable

variable = "변수는 이렇게 차후에 다른 값을 할당할 수 있지만"
// constant = "상수는 차후에 값을 변경할 수 없습니다" // 오류발생

 

상수 선언 후 값 할당하기

-> 나중에 할당하려는 상수나 변수는 타입을 꼭 명시해주어야 합니다.

 

let sum: Int
let inputA: Int = 100
let inputB: Int = 200

// 선언 후 첫 할당
sum = inputA + inputB

// sum = 1 // 그 이후에는 다시 값을 바꿀 수 없습니다, 오류발생

// 변수도 물론 차후에 할당하는 것이 가능합니다
var nickName: String

nickName = "Smith"

// 변수는 차후에 다시 다른 값을 할당해도 문제가 없지요
nickName = "스미스"

 

생각해보기

let name = "smith" //이름은 바뀌지 않으니 상수
var numberToAdd = 5 //더하려는 숫자는 바뀔수 있으니 숫자??
let pi = 3.14195 //파이는 상수
let maxItemCount = 1000  // 최대 아이탬개수는 상수

 

 

 

https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html

 

The Basics — The Swift Programming Language (Swift 5.7)

The Basics Swift is a new programming language for iOS, macOS, watchOS, and tvOS app development. Nonetheless, many parts of Swift will be familiar from your experience of developing in C and Objective-C. Swift provides its own versions of all fundamental

docs.swift.org

https://blog.yagom.net/

 

yagom's blog

야곰의 프로그래밍 블로그입니다. iOS, Swift, Objective-C, C에 대해 이야기합니다.

blog.yagom.net

 

이름짓기 규칙

Swift는 기본적으로 Camel Case를 사용

 

- Lower Camel Case : function, method, variable, constant

   Ex) someVariableName

- Upper Camel Case : type(class, struct, enum, extension ...)

   Ex) Person, Point, Week

- Swift는 모두 대소문자를 구분함

 

콘솔로그

- print() : 단순 문자열을 출력

- dump() : 인스턴스의 자세한 설명(description 프로퍼티) 까지 출력  -> 기본적으로 콘솔로그에 남기는 동작을함

 

문자열 보간법

- String Interpolation

- 프로그램 실행 중 문자열 내에 변수 또는 상수의 실질적인 값을 표현하기 위해 사용

- \() 사용

let age: Int = 10 //나이 상수를 선언

"안녕하세요! 저는 \(age)살입니다!" // \()을 사용하여 문자열 보간

print("안녕하세요! 저는 \(age)살입니다!") //콘솔로그에서 확인

class Person{
    var name : String = " yagom "
    var age : Int = 10
}

let yagom : Person = Person()

print(yagom) //프로젝트이름.Person
print("----------")
dump(yagom) // 프로젝트이름.Person #0
            // - name: " yagom "
            // - age: 10

 

 

 

 

 

https://blog.yagom.net/

 

yagom's blog

야곰의 프로그래밍 블로그입니다. iOS, Swift, Objective-C, C에 대해 이야기합니다.

blog.yagom.net

 

Swift 문법 공부는 yagom님을 통해 하였습니다.

좋은 강의 감사합니다.

 

 

https://blog.yagom.net/

 

yagom's blog

야곰의 프로그래밍 블로그입니다. iOS, Swift, Objective-C, C에 대해 이야기합니다.

blog.yagom.net

 

+ Recent posts