Apple은 공식적으로 left/right constraint 보다 leading/trailing의 사용을 권장하고 있다!
우선 left/right은 사용자가 보는 화면상의 왼쪽과 오른쪽 위치 속성이다
반면에 leading/trailing은 reading direction의 시작과 끝을 나타내는 위치 속성!
leading, trailing으로 설정해주면 알아서 위치를 flip을 해준다.
그렇기 때문에 Apple 에서도 left/right 대신 leading, trailing을 권하는 것이다.
하지만 만약 아랍권에서도 쓸 애플리케이션의 어떤 UI component가 어떤 일이 있어도,
화면상의 왼쪽 또는 오른쪽에 붙어있길 바란다면 그 땐 left, right constraint를 걸어줘야 한다.
let blueView = UIView(frame: CGRect(x: 80.0, y: 244.0, width: 160.0, height: 80.0))
blueView.backgroundColor = UIColor.blue
self.view.addSubview(blueView)
struct UserData {
var name: String
var age: Int
mutating func updateUser(_ name: String, _ age: Int) {
self.name = name
self.age = age
print("이름 : \(name), 나이 : \(age)")
}
}
var shark = UserData(name: "상어", age: 16)
print("이름 : \(shark.name), 나이 : \(shark.age)")
// 이름 : 상어, 나이 : 16
var candy = shark
candy.name = "캔디"
candy.age = 30
print("이름 : \(shark.name), 나이 : \(shark.age)")
// 이름 : 상어, 나이 : 16
print("이름 : \(candy.name), 나이 : \(candy.age)")
// 이름 : 캔디, 나이 : 30
shark.updateUser("띠용", 33)
// 이름 : 띠용, 나이 : 33
class Phone {
var name: String
var color: String
// struct와 달리 class는 이니셜라이즈를 지정해야합니다.
init(name: String, color: String) {
self.name = name
self.color = color
}
func updatePhone(name: String, color: String) {
self.name = name
self.color = color
print("폰 : \(name), 색상 : \(color)")
}
}
let iPhone8 = Phone(name: "iPhone8", color: "red")
print("폰 : \(iPhone8.name), 색상 : \(iPhone8.color)")
// 폰 : iPhone8, 색상 : red
var iPhoneXs = iPhone8
iPhoneXs.name = "iPhoneXs"
iPhoneXs.color = "grey"
print("폰 : \(iPhone8.name), 색상 : \(iPhone8.color)")
// 폰 : iPhoneXs, 색상 : grey
print("폰 : \(iPhoneXs.name), 색상 : \(iPhoneXs.color)")
// 폰 : iPhoneXs, 색상 : grey
iPhoneXs.updatePhone(name: "iPhoneX", color: "black")
// 폰 : iPhoneX, 색상 : black
enum Animal {
case dog
case cat
case rabbit
case etc
func printAnimal() {
switch self {
case .dog:
print("개 입니다.")
case .cat:
print("고양이 입니다.")
case .rabbit:
print("토끼 입니다.")
default:
print("그 외 입니다.")
}
}
}
Animal.etc.printAnimal()
// 그 외 입니다.
// MARK: - Struct
struct Student {
let name: String?
let birth: String?
let grade: String?
let gender: String?
}
struct Teacher {
let name: String?
let job: String?
}
// MARK: - Enum
enum School {
case students(Student)
case teachers(Teacher)
}
// MARK: - Public
func printStudent(_ student: Student) {
guard let name = student.name,
let birth = student.birth,
let grade = student.grade,
let gender = student.gender
else { return }
print("이름 : \(name), 생년월일 : \(birth), 학년 : \(grade), 성별 : \(gender) ")
}
func printTeacher(_ teacher: Teacher) {
guard let name = teacher.name,
let job = teacher.job
else { return }
print("선생님 성함 : \(name), 선생님 과목 : \(job)")
}
// MARK: - Property
// student 초기값 설정
let shark = Student(name: "상어",
birth: "1999.02.27",
grade: "3",
gender: "여")
// teacher 초기값 설정
let candy = Teacher(name: "캔디",
job: "수학")
var student: School? {
didSet {
// students case의 연관값을 받아옵니다.
guard case .students(let student)? = student
else { return }
printStudent(student)
}
}
var teacher: School? {
didSet {
// teachers case의 연관값을 받아옵니다.
guard case .teachers(let teacher)? = teacher
else { return }
printTeacher(teacher)
}
}
student = School.students(shark)
// 이름 : 상어, 생년월일 : 1999.02.27, 학년 : 3, 성별 : 여
teacher = School.teachers(candy)
// 선생님 성함 : 캔디, 선생님 과목 : 수학
init에는 designated init과 convenience init이 있다.
그 중 Convenience init은 보조 이니셜라이저로, 내부에서 같은 클래스의 designated init을 호출하여 클래스의 원래 이니셜 라이저를 도와주는 역할을 한다.
Convenience init은 모든 프로퍼티를 받아야 하는 designated init과 달리, 필요한 부분만 파라미터로 받아서 초기화할 수 있다.
class Person {
var name: String
var age: Int
var gender: String
init(name: String, age: Int, gender: String) {
self.name = name
self.age = age
self.gender = gender
}
convenience init(age: Int, gender: String) {
self.init(name: "zedd", age: age, gender: gender)
}
}
var things: [Any] = []
things.append(1)
things.append(1.0)
things.append("a")
things.append(false)
things.append(Human.init()))
things.append({ print("I am Ann") })
var things: [AnyObject] = []
things.append(1) // Argument type 'Int' expected to be an instance of a class
things.append(1.0) // Argument type 'Double' expected to be an instance of a class
things.append("sodeul") // Argument type 'String' expected to be an instance of a class
things.append(false) // Argument type 'Bool' expected to be an instance of a class
things.append(Teacher.init()))
things.append({ print("I am Sodeul!") }) // Argument type '()->()' expected to be an instance of a class