'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 |
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 |
구조체와 클래스의 정의 구문은 비슷합니다. 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)
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(#"!@#$%^&*(\'"<>?:;"#)
//!@#$%^&*(\'"<>?:; 그대로 출력됨.
Swift 알고리즘 클럽 (0) | 2023.06.30 |
---|---|
Swift 기본문법) 구조체와 클래스 (0) | 2023.06.30 |
Swift 기본문법) 컬렉션 타입 (0) | 2022.09.05 |
Swift 기본문법) 기본 데이터 타입 (1) | 2022.08.31 |
Swift 기본문법) 상수와 변수 (1) | 2022.08.30 |
-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는 키 와 값 의 쌍으로 이루어진 컬렉션 타입입니다.
// 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의 선언과 생성
// 빈 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]
다음과 같은 경우에는 각각 어떤 컬렉션 타입을, 상수/변수 선언 중 어떤 것을 사용하면 유용할지 생각해 봅시다.
Swift 기본문법) 구조체와 클래스 (0) | 2023.06.30 |
---|---|
Swift 기본문법) 특수문자 출력 (0) | 2023.06.17 |
Swift 기본문법) 기본 데이터 타입 (1) | 2022.08.31 |
Swift 기본문법) 상수와 변수 (1) | 2022.08.30 |
Swift 기본문법) 이름짓기, 콘솔로그, 문자열보간법 (0) | 2022.08.22 |
- 모든 데이터 타입의 이름은 첫 글자를 대문자로 입력한다.
- 모든 데이터 타입(Int, Float, Double, Bool, String, Array, Dictionary, Set 등)은 모두 Struct (구조체)를 기반으로 구현되어 있다.
(쉽게 설명하자면, 우리가 숫자를 표현하고 싶을 때 Int 라고 입력해서 바로 사용할 수 있도록 Swift에 미리 구조체 라는 것으로 만들어져 있다는 의미)
<-> Reference Type : class, function, closure 등
- 스위프트는 데이터 타입 엄격하게 관리하므로 암시적으로 이루어지는 데이터 타입의 변형으로부터 일어날 수 있는 예기치 않은 결과를 일으키는 경우를 방지해야 한다.
- true 와 false 만을 값으로 가지는 타입
var someBool: Bool = true
someBool = false
// someBool = 0 // 컴파일 오류발생
// someBool = 1 // 컴파일 오류발생
- Int : 정수 타입. 현재는 기본적으로 64비트 정수형.
var someInt: Int = -100
// someInt = 100.1 // 컴파일 오류발생
-UInt : 양의 정수 타입. 현재는 기본적으로 64비트 양의 정수형
var someUInt: UInt = 100
// someUInt = -100 // 컴파일 오류발생
// someUInt = someInt // 컴파일 오류발생
-Float : 실수 타입. 32비트 부동소수형
var someFloat: Float = 3.14
someFloat = 3
-Double : 실수 타입. 64비트 부동소수형
var someDouble: Double = 3.14
someDouble = 3
// someDouble = someFloat // 컴파일 오류발생
- 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
-swift의 모든 타입을 지칭하는 키워드
var someAny: Any = 100
someAny = "어떤 타입도 수용 가능합니다"
someAny = 123.12
Any 타입에 Double 자료를 넣어두었더라도 Any는 Double 타입이 아니기 때문에 할당할 수 없습니다.
명시적으로 타입을 변환해 주어야 합니다.
타입 변환은 차후에~
let someDouble: Double = someAny // 컴파일 오류발생
모든 클래스 타입을 지칭하는 프로토콜(클래스와 프로토콜은 차후에~)
class SomeClass {}
var someAnyObject: AnyObject = SomeClass()
AnyObject는 클래스의 인스턴스만 수용 가능하기 때문에 클래스의 인스턴스가 아니면 할당할 수 없습니다.
someAnyObject = 123.12 // 컴파일 오류발생
없음을 의미하는 키워드
다른 언어의 NULL, Null, null 등과 유사한 표현입니다.
아래 코드에서 someAny는 Any타입이고, someAnyObject는 AnyObject타입 이기 때문에
nil을 할당할 수 없습니다.
nil다루기는 옵셔널에서~
someAny = nil // 컴파일 오류발생
someAnyObject = nil // 컴파일 오류발생
https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html
Swift 기본문법) 특수문자 출력 (0) | 2023.06.17 |
---|---|
Swift 기본문법) 컬렉션 타입 (0) | 2022.09.05 |
Swift 기본문법) 상수와 변수 (1) | 2022.08.30 |
Swift 기본문법) 이름짓기, 콘솔로그, 문자열보간법 (0) | 2022.08.22 |
Swift 기본문법) 시작하며 (0) | 2022.08.22 |
- 상수 선언 키워드 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
Swift 기본문법) 특수문자 출력 (0) | 2023.06.17 |
---|---|
Swift 기본문법) 컬렉션 타입 (0) | 2022.09.05 |
Swift 기본문법) 기본 데이터 타입 (1) | 2022.08.31 |
Swift 기본문법) 이름짓기, 콘솔로그, 문자열보간법 (0) | 2022.08.22 |
Swift 기본문법) 시작하며 (0) | 2022.08.22 |
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
Swift 기본문법) 특수문자 출력 (0) | 2023.06.17 |
---|---|
Swift 기본문법) 컬렉션 타입 (0) | 2022.09.05 |
Swift 기본문법) 기본 데이터 타입 (1) | 2022.08.31 |
Swift 기본문법) 상수와 변수 (1) | 2022.08.30 |
Swift 기본문법) 시작하며 (0) | 2022.08.22 |
Swift 기본문법) 특수문자 출력 (0) | 2023.06.17 |
---|---|
Swift 기본문법) 컬렉션 타입 (0) | 2022.09.05 |
Swift 기본문법) 기본 데이터 타입 (1) | 2022.08.31 |
Swift 기본문법) 상수와 변수 (1) | 2022.08.30 |
Swift 기본문법) 이름짓기, 콘솔로그, 문자열보간법 (0) | 2022.08.22 |