let
)var
)let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0
코드에 저장된 값이 변경되지 않으면 항상 let 키워드를 사용하여 상수로 선언합니다. 변경할 수 있어야 하는 값을 저장하는 경우에만 변수를 사용합니다.
var currentLoginAttempt: Int = 0
"Int"
가 Type Annotations 입니다.var red, green, blue: Double
print(friendlyWelcome)
// Prints "Bonjour!"
스위프트는 문자열 보간 방법을 사용해서 문자열 내에 상수나 변수를 포함 할 수 있습니다.
print("The current value of friendlyWelcome is \\(friendlyWelcome)")
// Prints "The current value of friendlyWelcome is Bonjour!"
// This is a comment.
/* This is also a comment
but is written over multiple lines. */
/* This is the start of the first multiline comment.
/* This is the second, nested multiline comment. */
This is the end of the first multiline comment. */
let cat = "🐱"; print(cat)
// Prints "🐱"
min 및 max 속성을 사용하여 각 정수 유형의 최소값 및 최대값에 액세스할 수 있습니다.
let minValue = UInt8.min
// minValue is equal to 0, and is of type UInt8
let maxValue = UInt8.max
// maxValue is equal to 255, and is of type UInt8
Double의 정밀도는 최소 15자리 소수점 이하 자릿수인 반면 Float의 정밀도는 소수점 이하 6자리까지 가능합니다.
두 유형 중 하나가 적절한 상황에서는 Double이 선호됩니다.
let meaningOfLife = 42
// meaningOfLife is inferred to be of type Int
let pi = 3.14159
// pi is inferred to be of type Double
let anotherPi = 3 + 0.14159
// anotherPi is also inferred to be of type Double
let cannotBeNegative: UInt8 = -1
// UInt8 can't store negative numbers, and so this will report an error
let tooBig: Int8 = Int8.max + 1
// Int8 can't store a number larger than its maximum value,
// and so this will also report an error
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi equals 3.14159, and is inferred to be of type Double
let integerPi = Int(pi)
// integerPi equals 3, and is inferred to be of type Int
typealias AudioSample = UInt16
var maxAmplitudeFound = AudioSample.min
// maxAmplitudeFound is now 0
if turnipsAreDelicious {
print("Mmm, tasty turnips!")
} else {
print("Eww, turnips are horrible.")
}
// Prints "Eww, turnips are horrible."
let nameAge = ("kim", 22)
let nameAge = (name: "kim", age: 22)
print(nameAge.name)
// Prints "kim"
print(nameAge.age)
// Prints 22
튜플은 특히 함수의 반환 값으로 유용합니다. 웹 페이지 검색을 시도하는 함수는 페이지 검색의 성공 또는 실패를 설명하기 위해 (Int, String) 튜플 유형을 반환할 수 있습니다.
튜플은 관련 값의 간단한 그룹에 유용합니다. 복잡한 데이터 구조 생성에는 적합하지 않습니다.
데이터 구조가 더 복잡할 가능성이 있는 경우 튜플이 아닌 클래스 또는 구조로 모델링합니다.
?, !
를 붙여 사용합니다.변수를 값이 없는 상태로 설정합니다.
var serverResponseCode: Int? = 404
// serverResponseCode contains an actual Int value of 404
serverResponseCode = nil
// serverResponseCode now contains no value
var surveyAnswer: String?
// surveyAnswer is automatically set to nil
let convertedNumber: Int? = 1
if convertedNumber != nil {
print("convertedNumber contains some integer value.")
}
// Prints "convertedNumber contains some integer value."
if let 사용할상수이름 = 비교할 Optional {
동작내용
}
비교할 Optional의 값이 존재하면 그 값은 옵셔널 상태가 아닌 기본 상태로 사용할상수이름에 초기화 됩니다.
동작내용에선 기본적으로 사용할상수이름을 이용한 동작을 구현합니다.
if 문의 첫 번째 분기 내에서 사용할상수이름을 변경해야 하는 경우 if var 사용할상수이름으로 작성해서 변경이 가능합니다.
- 쉼표로 구분하여 필요한 만큼 단일 if 문에 Optional Binding과 조건을 포함할 수 있습니다.
- 다음 if 문은 동일합니다.
if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
print("\\(firstNumber) < \\(secondNumber) < 100")
}
// Prints "4 < 42 < 100"
if let firstNumber = Int("4") {
if let secondNumber = Int("42") {
if firstNumber < secondNumber && secondNumber < 100 {
print("\\(firstNumber) < \\(secondNumber) < 100")
}
}
}
// Prints "4 < 42 < 100"
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // 강제 추출
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // 암시적 추출
함수는 선언에 throw 키워드를 포함하여 오류를 throw할 수 있음을 나타냅니다.
func canThrowAnError() throws {
// this function may or may not throw an error
}
Swift는 catch 절에 의해 처리될 때까지 오류를 현재 범위 밖으로 자동으로 전파합니다.
do {
try canThrowAnError()
// no error was thrown
} catch {
// an error was thrown
}
Assertions and Preconditions은 런타임시에 실행하는 검사입니다.
코드가 유효하지 않은 상태가 감지되는 즉시 실행을 중지하면 그로인한 인한 손상을 제한하는데 도움이 되기 때문에 Assertions and Preconditions을 사용합니다.
Assertions and Preconditions을 사용합니다.의 차이점은 확인 시점에 있습니다.
Assertions 디버그 빌드에서만 확인되지만 Preconditions은 디버그 및 프로덕션 빌드 모두에서 확인됩니다. 프로덕션 빌드에서 Assertions 내부의 조건은 평가되지 않습니다. 즉, 프로덕션 성능에 영향을 주지 않고 개발 프로세스 중에 원하는 만큼 Assertions을 사용할 수 있습니다.
let age = -3
assert(age >= 0, "A person's age can't be less than zero.")
// age의 값은 -3으로 age >= 0 조건은 false가 되므로 프로그램은 A person's age can't be less than zero. 을 출력하며 종료됩니다.
func assert(_ condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = String(), file: StaticString = #file, line: UInt = #line)
if age > 10 {
print("You can ride the roller-coaster or the ferris wheel.")
} else if age >= 0 {
print("You can ride the ferris wheel.")
} else {
assertionFailure("A person's age can't be less than zero.")
}
// In the implementation of a subscript...
precondition(index > 0, "Index must be greater than zero.")
condition
테스트할 조건입니다.조건은 playgrounds와 -Onone 빌드(Xcode의 디버그 구성에 대한 기본값)에서만 사용이 가능합니다.message
조건이 false로 평가되는 경우 인쇄할 문자열입니다. 기본값은 빈 문자열입니다.file
실패할 경우 메시지와 함께 인쇄할 파일 이름입니다. 기본값은 assert(::file:line:) or precondition(::file:line:) 가 호출되는 파일입니다.line
실패할 경우 메시지와 함께 인쇄할 줄 번호입니다. 기본값은 assert(::file:line:) or precondition(::file:line:)가 호출되는 줄 번호입니다.
unchecked 모드(-Ounchecked)로 컴파일하면 전제 조건이 확인되지 않습니다. 컴파일러는 전제 조건이 항상 참이라고 가정하고 그에 따라 코드를 최적화합니다.
하지만, fatalError(_:file:line:) 함수는 최적화 설정에 관계없이 항상 실행을 중지합니다.프로토타이핑 및 초기 개발 중에 fatalError(_:file:line:) 함수를 사용하여 스텁 구현으로 fatalError("Unimplemented")를 작성하여 아직 구현되지 않은 기능에 대한 스텁을 만들 수 있습니다.
치명적인 오류는 절대 최적화되지 않기 때문에 assertions or preconditionsd와 달리 스텁 구현이 발생하면 실행이 항상 중지됩니다