코틀린과 동일하게 타입추론이 가능하다.
var numArr : Array<Int> = Array<Int>()
numArr.append(3)
numArr.append(3)
numArr.append(3)
numArr.append(3)
numArr[0]
numArr.insert(5,at:1)
var set: Set = Set<Int>()
set.insert(10)
set.insert(20)
set.insert(10)
set // 10 , 20
var dic: Dictionary<String,Int> = Dictionary<String,Int>()
dic["강창환"] = 3
dic["김택구"] = 3
dic["고은수"] = 5
dic["강창환"] = 51
dic
var dic2: [String: Int] = ["고오공": 1]
dic2
dic.removeValue(forKey: "고은수")
dic
func 함수명(파라미터 이름 : 데이터 타입) -> 반환 타입 { return 반환값}
if조건식 { 실행할 구문 } else { 아닌경우 }
swich case
for in 배열
repeat while
while
var num:Int> = nil
guard 는 ? 같은 역할 값이 있을때면 실행
구조체를 let(const)로 선언시 내부 필드도 const가되어 변경 불가하지만
클래스는 let으로 선언해도 내부필드 변경이 가능하다.
값의 변경을 감지한다. (저장 프로퍼티와 오버라이드된 저장 프로퍼티에서 사용가능)
class Account {
var credit: Int = 0 {
willSet{
print("잔액이 \(credit)원에서 \(newValue)원으로 변경될 예정입니다.")
}
didSet{
print("잔액이 \(oldValue)원에서 \(credit)원으로 변경 되었습니다.")
}
}
}
객체를 생성하지 않고 사용가능 ( static 클래스랑 비슷)
struct SomeStructure{
static var storeTypeProperty = "Some value."
static var computedTypeProperty: Int {
return 1
}
}
SomeStructure.storeTypeProperty
SomeStructure.computedTypeProperty
클래스와 구조체의 차이점
-> 클래스는 참조 타입 (대입시 주소를 참조)
-> 구조체는 값 타입 (변수에 대입이 값이 복사)
상속시에 부모 클래스의 프로퍼티와 메소드를 사용할 수 있으며 재정의 또한 가능하다.
타입을 확인하거나 다른타입으로 변환할때 사용 ( is , as )
for item in library{
if item is Movie {
movieCount += 1
}else if item is Song {
songCount += 1
}
}
for item in library{
if let movie = item as? Movie {
...
}else if let song = item as? Song {
...
}
}
-> ? ! 차이는 타입변환 가능 여부가 불확실 or 확실assert?
- 조건체크 후 조건이 맞지 않으면 메세지를 출력하는 함수
- 디버깅 모드에서만 작동하며 조건의 검증을 위해 사용
var value = 0 assert(value == 0) value = 2 assert(value == 0, "값이 0이 아닙니다.")
guard
- 무언가를 검사하여 다음에 오는 코드 실행여부를 결정
- guard문에 주어진 조건문이 거짓일때 구문이 실행
func guardTest(value: Int){ guard value == 0 else {return} print("안녕하세요") }
인터페이스처럼 어떤 역할을 지정
protocol FirstProtocol {
var name: Int{get set}
var age: Int{get}
}
위 코드처럼 get set 지정도 가능
protocol AnotherProtocol {
static var someTypeProperty: Int{get set}
}
protocol SomeProtocol5 {
init()
}
class SomeClass :SomeProtocol5{
required init() {
}
}
extension Int{
var isEven: Bool {
return self % 2 == 0
}
var isOdd: Bool {
return self % 2 == 1
}
}
extension String {
func convertToInt() -> Int? {
return Int(self)
}
}
enum CompassPoint: String{
case north = "북"
case south = "남"
case east = "동"
case west = "서"
}
var direction = CompassPoint.east
direction = .west
direction = .north
switch direction {
case .north:
print(direction.rawValue)
case .south:
print("north")
default:
print("etc")
}
enum PhoneError {
case unknown
case batteryLow(String)
}
let error = PhoneError.batteryLow("배터리 곧 방전이야 임마")
struct Developer {
var name: String
}
struct Company{
var name: String
var developer: Developer?
}
var developer = Developer(name: "kang")
var company = Company(name: "google", developer: developer)
print(company)
print(company.developer!.name)
print(company.developer?.name)
func chackPhoneBatteryStatus(batteryLevel: Int) throws -> String {
guard batteryLevel != -1 else {throw PhoneError1.unknown }
guard batteryLevel > 20 else {throw
PhoneError1.batteryLow(batteryLevel: 20)
}
return"배터리 상태가 정상입니다."
}
/*
do {
try 오류 방생 가능코드
}catch 오류 패턴 {
처리 코드
}
*/
do{
try chackPhoneBatteryStatus(batteryLevel: 20)
}catch PhoneError1.unknown {
print("알 수 없는 에러입니다.")
}catch PhoneError1.batteryLow(let baterryLevel){
print("베터리가 \(baterryLevel)입니다.")
} catch {
print("그 외 오류 발생: \(error)")
}
let status = try? chackPhoneBatteryStatus(batteryLevel: 30)
print(status)
let status = try! chackPhoneBatteryStatus(batteryLevel: 10) // 에러 발생
print(status)
() -> () in
let hello = { () -> () in print("hello")}
hello()
let hello2 = {(name :String) -> String in
return "hello, \(name)"
}
print(hello2("kang"))
func doSomething(closure: () -> ()){
closure()
}
doSomething {
print("gogol")
}
doSomething(closure: { () ->()in
print("hello")
})
func doSomething2() -> () -> () {
return {
() -> () in print("뭐야")
}
}
doSomething2()()
stream과 비슷