Swift
bundle id >> 앱스토어 올릴때 , 암호화 할 때 필요하다
Main.storyboard
여러개의 화면구조를 하나로 만드는 것
스토리 보드에 처음 view ''-->'' : initial seg
텍스트 박스 > placeholder 로 수정해 줄 수 있음
개발환경 도움을 주기 위해서 assistant mode 가 있음
! : let 로 선언했을 때 값을 바꾸게 될때
optinal : 값을 바꾸면 안됨
멤버변수에 접근하기위해 self를 썼는데 ... swift에서는 안쓰는 것을 권장
COCOA TOUCH
ios에서 최상위 레벨의 레이어
UIKit Framework 화면 표시 담당
Foundation는 큰 수정 없이 ios에 적용
swift 언어 특징
- 안전 제일주의
- swift coding을 위한 구성
- 엄격한 타입 검사를 한다.
- 간결한 문법과 명확한 포ㅛ현
- 클래스 보단 구조체
- ...등등
- 유연한 언어이다.
- OPP로 개발 가능 / POP로 깨발 가능 / Functional Programming 도 가능 / 섞어쓰기도 가능하다.
유연한 trade off 가 필요하다.
실습
새로운 프로젝트 > playground
automatically run 으로 설정
swift 언어 문법
main 함수 없음
; 없음
var 보다는 let 사용하기 >> 안정적임
converting >> String(width)
let apples = 3
let oranges = 5
let appleSum = "I have \(apples) apple"
print(appleSum)
let fruitSum = "I have \(apples + oranges) fruits"
print(fruitSum)
쉽게 사용 가능
hasPrefix, hasSuffix, count 등 표준 함수 활용 가능
튜플
typealias CLLocationDegress = Double let latitude: CLLocationDegress = 34.3731391 let longitude: CLLocationDegress = 135.5678211
let myLocation = ("JYP" , latitude,longitude)
myLocation.0
myLocation.1
myLocation.2
let friendLocation : (name:String, latitude:CLLocationDegress, longitude:CLLocationDegress)
= ("Cook",37.331842, -122.033687)
friendLocation.name
friendLocation.latitude
friendLocation.longitude
let distance = (myLocation , friendLocation)
let(me,you) = distance
me.0
you.name
typealias AirportInfo = (ICAO : String, latitude : CLLocationDegress , longitude : CLLocationDegress)
typealias DistanceSource = (from : AirportInfo, to: AirportInfo)
//튜플로 묶여있는것을 또한번 튜플로 묶었음
let fromKIXtoICN: DistanceSource = (("ABC",34.1231,123.2342),("RKSI",34.234234,124.342342))
fromKIXtoICN.from.ICAO
fromKIXtoICN.to.ICAO
- 배열
```swift
let toDo = ["점심식사","커피한잔", "이슈잡기" , "푸시하기"]
let inProgress : [String] = ["Let's Swift!!"]
//----------
var toDo :Array<String> = ["점심식사","커피한잔", "이슈잡기" , "푸시하기"]
var inProgress : [String] = ["Let's Swift!!"]
var done = [String]()
//-----------
print(toDo)
print(inProgress)
toDo.first
toDo.last
toDo.append("퇴근") //error 난다>>> var 로 바꿔줘야함
toDo = toDo + ["저녁먹고","스위프트 복습"]
print(toDo)
inProgress.removeAll()
inProgress.append((toDo[0]))
toDo.removeFirst()
done = done + inProgress
print(done)
- dictionary
var toDoWithTime = ["점심식사" : 60 , "커피한단" :10]
var toDowithTime1 : [String:Int] = [:]
var toDowithTime2 : Dictionary = [String : Int]()
print(toDoWithTime)
toDoWithTime["영화보기"] = 120
print(toDoWithTime.keys)
print(toDoWithTime.values)
toDoWithTime["커피한잔"] = nil
//nil >>> 아무것도 없음의 의미
print(toDoWithTime)
흐름제어
if, switch
for-in, for, while
repeat-while
Optional
옵셔녈 벨류는 내부의 ‘값’을 쓰기 위해서 옵셔널을 ‘벗겨내야’ 함
let p: String = "123ddf" let c = Int(p) print(c)
변환에 실패하면 >> 값이 없음 으로 리턴해준다.
nil
c 는 값이 있을 수도 있고 없을 수도 있다.
이 상태를 optilnal 이라고 함
?를 쓴다.
let p: String = "123ddf"
let c:Int? = Int(p)
print(c)//결과 nil
let p: String = "123"
let c:Int? = Int(p)
print(c) // 1) 결과 Optional(123) >> Optional을 떼어내는 작업을 해야함
if c == nil{
print("값 없음")
}else {
print(c)
}
1) 해결 방법
!를 쓰면됨 >> 안정성이 안좋음 >>앱이 죽을 수 있음
print("값 진짜 있음 \(c!)")
if문으로 해결
if let value = c { print("값이 있음 \(value)") }
implicity unwarpped optional 사용
- 변수쪽에서 할당받는 값이 반드시 있으니,바로 unwrap 된 채로 사용
//Implicity unwarpped optional var value2 : Int! = c c = c! + 10 // unwrapping 안되어 있어서 써 줘야 함 value2 = value2 + 10 // 선언할때 이미 !로 unwrapping 했기 때문에 print(value2)
guard let 으로 선언
Optional Chaining
배열도 옵셔널 , 그 배열의 값도 옵셔널 이라면?
typealias Sample = (valueOpt:Int? , value:Int) var value3: Sample? = (100,200) if let v1 = value3{ print(v1) if let v2 = v1.valueOpt{ print(v2) } }
if 문이 너무 많아 질 수 있음
해결:
if let v2 = value3?.valueOpt{
print(v2)
}
// value3 배열의 valueOpt 값 까지 옵셔널 걸어줌
함수
예시
func greet(person: String, day : String ) -> String {
return "어서오세요~ \(person) 님, \(day) 일째 로그인이십니다!"
}
print(greet(person:"JYP" ,day: "120"))
func sumOf(numbers: Int...) -> Int{
var sumTotal = 0
for sum in numbers {
sumTotal += sum
}
return sumTotal
}//... 여러개의 불규칙한 값을 받을 것이다. 라는 의미
func returnFifteen() -> Int{
var rValue = 10
func add(){
rValue += 5
}
add()
return rValue
}
print(returnFifteen())
First Class Type
//First Class Type ㅣ 함수 > 자료형으로 쓸 수 있다.
func makeIncrement() -> ((Int) -> Int){
func addOne(number: Int) -> Int{
return number + 1;
}
return addOne
}
let 더하기 = makeIncrement()
print(더하기(8))
함수는 자료형이다.
func hasAnyMatches(list:[Int], condition : (Int)-> Bool) -> [Int]{
var rValue = [Int]()
for item in list{
if condition(item) == true{
rValue.append(item)
}
}
return rValue
}
func isEvenNumber(number: Int) -> Bool{
return (number % 2) == 1
}
hasAnyMatches(list: [1,2,3,4,5,6,7], condition: isEvenNumber)
클로저
let closure = { (number : Int) -> Void in
print("클로저")
}
//int 를 받고 int 를 반환해주는
closure(1)
let numbers = [1,2,3,4,5,6,7]
// 1
numbers.map({(number : Int) -> String in
return String(number * 3)
})
//리턴에서 이미 string 으로 리턴한다고 명시되어 있기 때문에 >> ->String 이라고 리턴 타입을 안적어 줘도 됨
// 알아서 합리적으로 리턴을 시켜주기 때문에 return 을 명시해줄 필요 없음
//
numbers.map({(number : Int) in
String(number * 3)
})
//타입도 선언해줄 필요 없음
numbers.map({number in
String(number * 3)
})
//변수명도 적어줄 필요 없음
numbers.map({
String($0 * 3)
})
//괄호 필요 없음
//5
numbers.map{
String($0 * 3)
}
1번과 5번은 같은 함수 이다.
ex> sort
let r2 = numbers.sorted {$0 > $1}
print(r2)
'프로그래밍 언어 > Swift' 카테고리의 다른 글
swfit 실습 day02 (0) | 2020.02.01 |
---|---|
IOS Delegate 패턴 (0) | 2018.11.25 |
Swift 언어란? (0) | 2018.11.25 |
swift 기본 문법 (0) | 2018.11.19 |