오늘의 주제

Objective-C의 상수와 스위프트의 상수


안녕하세요 야곰입니다.

Objective-C를 쓰다가 스위프트로 넘어왔을 때 고민되었던 부분 중의 하나인 스위프트의 상수에 관해 이야기해 보려 합니다.


혼자 프로젝트를 진행하다 보면 상수의 필요성을 많이 느낄 수 없을지 모르지만, 누군가 협업을 하게 된다면, 혹은 미래 또는 과거의 나와 협업(?)을 하게 된다면 상수의 필요성을 많이 느끼게 됩니다. 바꾸면 안 되는 데이터를 실수로 바꿔서 난감했던 경험이 없나요? 혹시 그런 적이 있다면 상수의 필요성에 대해서는 많이 공감하실 것으로 생각됩니다.


* 오해가 생길 소지의 표현들이 있어서 처음 발행 이후 조금 수정하였습니다. 좋은 의견 주신 과니님 고맙습니다 :)


사라진 const


사실 저는 Objective-C에서 특별한 경우가 아니면 const를 많이 사용하지 않았습니다(반성).


그런데 스위프트에서는 전역이든 지역이든 데이터를 저장할 공간(변수 또는 상수)에는 var 또는 let을 사용하여 변수인지 상수인지 명확히 명시해 주어야 하므로 상수에 대한 고민을 많이 하게 되었습니다.


사실 지역상수가 필요한 경우에 const 키워드를 쓰는 귀찮음 때문에 상수를 많이 사용하지 않았는데 스위프트에서는 var 또는 let을 선택해야 하는 시간이 조금 걸렸지만, 지금은 큰 시간 들일 필요 없이 자연스럽게 상수를 많이 사용하고 있습니다. 또, 혹시라도 상수로 사용해야 하는 경우임에도 변수로 선언하고 사용한다면 Xcode에서 변수 대신 상수를 사용하는 게 어떻냐는 경고를 보여줍니다. 




[Xcode의 경고]


지역상수


지역상수를 사용하는 경우에는 사실 Objective-C와 크게 다를 바 없이 사용할 수 있습니다. 상수의 이름을 지어주는 명명법도 크게 다를 바 없습니다. 

상수로 사용할 변수 앞에 const를 붙여 쓴 것처럼 let을 사용하여 상수를 선언하여 사용하면 됩니다.



// Objective-C
const NSInteger someConstant = 100;


// Swift
let someConstant: Int = 100



전역상수


전역상수를 사용할 때 조금 더 생각해보아야 할 것들이 있습니다. 저는 처음 스위프트를 사용할 때 별생각 없이 Objective-C에서 사용하던 것과 같은 명명법으로 전역상수를 사용했습니다.


// Objective-C NSInteger const  YGSomeGlobalConstant = 100;


// Swift
let YGSomeGlobalConstant: Int = 100


그런데 Objective-C에서 'YG'와 같이 접두어(prefix)를 붙이는 것은 Objective-C에는 네임스페이스(name space)가 없기 때문인데, 스위프트에는 이 단점을 극복했다는 것에 대한 생각이 문득 스쳤습니다.


Objective-C에는 네임스페이스가 없어서 전역변수를 선언하고 사용할 때 꽤 골치가 아팠습니다. 귀찮기도 아주 귀찮았죠. 이름도 매우 길어지기만 했습니다. 열거형(enum)은 정수밖에 지원하지 않기 때문에 다른 타입의 값들은 관련된 상수끼리 묶어 쓰기도 어렵기도 했지요.


// Objective-C의 상수들... // 네임스페이스가 없기 때문에 // 연관된 상수들을 접두어를 사용하여 표현합니다 // 요일 상수들 NSString *const YGWeekMonday = @"MON"; NSString *const YGWeekTuesday = @"TUE"; NSString *const YGWeekWednesday = @"WED"; NSString *const YGWeekThursday = @"THU"; NSString *const YGWeekFriday = @"FRI"; NSString *const YGWeekSaturday = @"SAT"; NSString *const YGWeekSunday = @"SUN"; // 네트워킹 관련 상수들 NSTimeInterval const YGNetworkingTimeoutInterval = 10.0f; NSUInteger const YGNetworkingMaxRetryCount = 3; NSString *const YGNetworkingBaseURLString = @"https://abc.com";


정말 보기만 해도 정신이 없습니다. 또, 실수로 복사 붙여넣기를 하다가 중복된 값을 넣었다면 컴파일 오류가 발생하지 않기 때문에 실수를 찾아내기도 매우 어려워집니다.


스위프트에서는 이런 전역 상수들을 조금 더 멋진 방법으로 표현해 볼 수 있습니다. 타입 내부에 다른 타입을 정의하는 방법으로 네임스페이스를 사용할 수 있습니다. 더군다나 네임스페이스 덕분에 접두어는 더 이상 스위프트에서 사용하지 않습니다.


// Week라는 구조체 타입 내부에
// 여러 타입 상수를 선언
struct Week {
    static let mon: String = "MON"
    static let tue: String = "TUE"
    static let wed: String = "WED"
    static let thu: String = "THU"
    static let fri: String = "FRI"
    static let sat: String = "SAT"
    static let sun: String = "SUN"
}

// 실제 사용시 Week.mon // "MON" Week.sat // "SAT"


처음에 이렇게 선언해 보았습니다. 그런데 만약 복사 붙여넣기를 하다가 실수로 중복된 값을 넣는다면...? 가령 "SUN"을 넣어야 하는데 "SAT"를 넣어버렸다면? 이때는 중복 값이 들어있는지 확인할 수 없습니다. 물론 의도적으로 다른 이름의 상수에 같은 값을 넣을 수도 있지만 그렇지 않은 경우에는 낭패입니다.


그래서 이렇게 개선해 봅니다.


// 열거형의 연관 값(associated value)을 사용하여
// 상수처럼 사용
enum Week: String {
    case mon = "MON"
    case tue = "TUE"
    case wed = "WED"
    case thu = "THU"
    case fri = "FRI"
    case sat = "SAT"
    case sun = "SUN"
}

// 실제 사용시 Week.mon.rawValue // "MON" Week.sat.rawValue // "SAT"



이렇게 사용하면 열거형 내부의 연관 값이 중복되는 경우에 컴파일오류가 발생하게 됩니다. 그래서 미리 실수를 발견하기도 좋습니다.


또, 위의 Objective-C로 선언했던 네트워킹 관련 상수를 스위프트에서 선언한다면 이렇게 바꿔볼 수 있을 것 같습니다.


// Objective-C NSTimeInterval const YGNetworkingTimeoutInterval = 10.0f; NSUInteger const YGNetworkingMaxRetryCount = 3; NSString *const YGNetworkingBaseURLString = @"https://abc.com";
// 사용 YGNetworkingTimeoutInterval // 10.0


// Swift
struct Networking {
    static let timeoutInterval: TimeInterval = 10.0
    static let maxRetryCount: Int = 3
    static let baseURL: URL? = URL(string: "https://abc.com")
}

// 사용

Networking.timeoutInterval // 10.0


이처럼 꼭 열거형의 연관 값을 사용하지 않고 용도에 맞게 구조체의 타입 상수(static let)로 사용해도 좋습니다. 


상수뿐만 아니라 전역변수, 전역함수(메서드) 등에도 충분히 응용할 수 있습니다.


또한 구조체 내부에 다른 타입(구조체, 클래스, 열거형) 등등 몇 단계를 걸쳐 내부 타입을 정의할 수 있기 때문 연관된 값을 타입의 타입의 타입까지 여러 번에 걸쳐 정의도 가능합니다.



struct CalendarItem {
    typealias Year = Int
    typealias Day = Int
    
    enum Week: String {
        case mon = "MON", tue = "TUE" //...
    }
    
    enum Month: Int {
        case jan = 1, feb, mar //...
    }
    
    static let startYear: Int = 1970
    static let startMonth: CalendarItem.Month = .jan
    
    struct Date {
        var day: Day = 1
        var weekDay: CalendarItem.Week = .mon
        var month: CalendarItem.Month = .jan
        var year: Year = CalendarItem.startYear
    }
}

var userBirthday: CalendarItem.Date userBirthday = CalendarItem.Date.init(day: 10, weekDay: .tue, month: .mar, year: 2017)



마치며


같은 Cocoa 플랫폼 위에서 코드를 작성하는데도 불구하고 역시나 언어의 특성을 살려 새로이 구조를 설계하기는 쉽지 않습니다 하핳


무언가 두서없이 써내려간 느낌입니다만, 잘 이해가 가지 않거나 궁금한 점이 있다면 댓글 남겨주세요 :D





by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/


p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


저작자 표시 비영리 변경 금지
신고
Posted by yagom


What's New in Cocoa Touch

WWDC 2016 - Session 205 



WWDC 2016 세션 205의 주제인 What's New In Cocoa Touch 요약정리입니다.

이 포스트는 세션 205요약 중 세 번째 글입니다.


지난 포스팅

  1. 2016/08/13 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 1/4
  2. 2016/09/05 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 2/4
이번 포스팅에선 아래 주제를 정리하고, 나머지 주제는 다음 포스팅에서 이어집니다.

# Adopting System Features
  • Opening applications
  • Core Data
  • CloudKit
  • NSUserActivity
  • App Search
  • CoreSpotlight Search API
  • ReplayKit
  • SceneKit
  • Apple Pay



Adopting System Features



iOS 10에서는 굳이 신경써서 도입하지 않아도 알아서 적용될 많은 기능들이 있습니다.

애플리케이션을 향상시킬 새로운 기능들이 있습니다. 이 기능들은 애플리케이션 아키텍쳐를 조금 더 단순화 시켜줄 수도 있습니다.



이는 애플리케이션을 다른 기능들과 더욱 긴밀하게 통합하여 줍니다.


  • Opening applications


그 좋은 예로 먼저 openURL이 있습니다. 컴플리션 핸들러(completion handler)를 통해 URL 열기를 비동기적으로 수행하도록 만들었습니다. 유니버셜 링크(universal link)도 추가했습니다. 만약 예를 들어 SNS 앱에서 유니버셜 링크를 통해 다른 앱을 실행하려고 한다고 생각해 봅시다. 앱이 설치되어 있으면 그 해당 앱이 실행될 것입니다. 그러나 앱이 설치되어있지 않다면, 그것을 확인하여 현재 SNS앱에서 적절히 처리해 줄 수 있도록 해당 앱 설치여부를 확인할 수 있습니다. 이를 통해 컨텐츠를 통합하고 시스템 내부에서 이 애플리케이션들을 적절히 다룰 수 있습니다.

  • Core Data


다음은 코어데이터입니다. 먼저 쿼리 제네레이션(query generation)이라는 것을 살펴봅니다. 분리된 컨텍스트에서 메인UI를 위한 컨텍스트가 존재하고, 이것들은 백그라운드 큐에서 실행하는 것이 일반적입니다. 쿼리 제네레이션을 사용하면 메인UI의 모델을 한 버전에서 또다른 버전으로 변경하는 것을 정확히 제어할 수 있습니다. 이는 기존에 강제적으로 처리했던 것들을 더이상 강제적으로 처리하지 않아도 되는 것을 의미합니다. 왜냐하면 백그라운드 큐에서 무엇인가 변경되고, 메인UI가 새로운 버전의 데이터로 언제 변경될 것인지 정확하게 결정할 수 있게 되기 때문입니다. 이를 통해 코어데이터 코드를 조금 더 단순화 시킬 수 있습니다.

또 다른 기능은 커넥션 풀링에 관한 것입니다. 이제 저장소에서 다중 읽기를 완벽히 지원합니다. 이는 성능향상에 큰 도움이 됩니다. 

또, 코어데티어 관련 툴에 새로운 기능들이 추가되었습니다만, 이는 [What's New in Core Data]에서 더 자세히 알아보시기를 추천드립니다.  

  • CloudKit


데이터를 모델링 하는 방법에는 CloudKit을 이용하는 방법도 있습니다.CloudKit에는 이미 사용자별로 공개 데이터베이스와 개인 데이터베이스를 가질 수 있게 되어있습니다. iOS 10에서는 Record sharing이 추가되었습니다. 그래서 여러 사용자가 하나의 기록에 공동으로 접근할 수 있습니다. 




CloudKit을 사용하는 협업 기반의 애플리케이션은 UI흐름을 다루는 데에는 어려움이 있었습니다.

문서를 공동작업하는데 다른 사람을 어떻게 초대하나요? 정말 안전(secure)한 방법으로 이를 구현할 수 있나요? 그래서 UICloudSharingController를 만들었습니다. 이 뷰 컨트롤러는 UIKit을 통해 화면에 표현할 수 있으며, CloudKit에서 제공하는 recored sharing을 제어하는 새로운 공유 객체를 전달해주기만 하면 됩니다. 



이 뷰 컨트롤러는 초대 흐름을 관리할 수 있는 UI를 자동 생성해줍니다.



또, 초대한 사람들의 목록도 자동으로 생성해 줍니다. 이를 통해 CloudKit을 활용한 협업 기반의 애플리케이션을 조금 더 쉽게 구성할 수 있습니다. [What's New with CloudKit] 세션을 통해 조금 더 자세한 내용을 확인할 수 있습니다.


  • NSUserActivity


NSUserActivity는 애플리케이션의 상태를 캡쳐하는데 사용합니다. 이제껏 핸드오프나 스포트라이트 같은 곳에서 사용해 왔죠.

iOS 10에서는 user activity에 위치도 추가할 수 있습니다. 만약 주소를 다루는 애플리케이션이라면 이 주소에 관한 활동을 사용자에게 표현하고 제공할 수 있습니다. MapKit 아이템을 activity에 추가하여 전달하기만 하면 됩니다. 텍스트 필드의 제안 기능에서 이 주소는 유용하게 사용될 수도 있을 것입니다.

이는 지능과 액티비티 기반의 iOS 10 기능입니다.


  • App Search


NSUserActivity가 사용되는 다른 지점이 있습니다. 바로 검색입니다. iOS 9에서 인덱스된 액티비티가 추가되었습니다. 이 인덱스된 액티비티는 스포트라이트 검색에 노출되었습니다.



이제는 새로운 버튼(Search in App)을 통해 앱 내의 검색으로 바로 진입하여 이어갈 수 있습니다.



이 기능을 구현하려면 먼저 info plist파일에 CoreSpotlightContinuation 키를 추가해 줍니다. 그 후 새로운 UIApplicationDelegate 메서드를 구현해주면 됩니다.


  • CoreSpotlight Search API


iOS 9에서 CoreSpotlight를 통해 앱 내부의 컨텐츠를 인덱싱 할 수 있도록 지원했습니다. 이제는 스포트라이트에서 데이터를 검색할 수 있습니다. 스포트라이트 인덱스를 개방했습니다. 

검색 쿼리를 구성하고 요청을 보내면 애플리케이션의 데이터를 위한 스포트라이트 인덱스를 검색할 수 있습니다. 이를 통해 애플리케이션 내부의 데이터를 시스템에 직접 인덱싱 할 수 있습니다. 이와 관련해서 [Making the Most of Search APIs] 세션을 참고하면 됩니다. 이 세션에서는 continuation과 CoreSpotlight의 검색 등에 대해 자세히 다룹니다.


  • ReplayKit


기존의 ReplayKit은 애플리케이션의 화면을 기록하기 위한 방법이었습니다. 이제 iOS 10에서는 ReplayKit을 사용하여 라이브 스트리밍을 할 수 있습니다. 즉, 생방송이 가능합니다. 


  • SceneKit


SceneKit의 렌더링 엔진이 새로워졌습니다. 물리 기반 렌더링을 수행합니다. iOS 9에 비해 비약적으로 발전했습니다.


  • Apple Pay


사용자 측면에서 애플페이는 어떤 플랫폼을 사용하는지에 상관없이 모든 곳에서 사용할 수 있게 되었습니다. 이제는 iOS와 워치 뿐만 아니라, 웹에서도 애플페이를 사용할 수 있게 되었습니다.



개발자 측면에서 애플페이는 여러가지가 추가되었습니다. 

UIKit 기반의 애플리케이션에서만 지원되었던 애플페이가 많이 확장되었습니다. 

이제는 새로운 자바스크립트 프레임워크를 통해 사파리에서도 애플페이를 지원할 수 있습니다. 이는 SFSafariViewController에서 애플페이를 지원할 수 있게 되었다는 뜻이기도 합니다. 

또, UI가 아닌 코드에서도 애플페이를 사용할 수 있습니다. UI가 아닌 익스텐션에서 사용할 수도 있는데, iMessage 앱의 익스텐션에서 애플페이를 사용하는 것이 좋은 예가 되겠습니다. 이와 관련하여 자세한 내용은 [Apple Pay on the Web]과 [What's New with Wallet and Apple Pay]세션에서 확인해 볼 수 있습니다.




# 간단요약

Opening applications

  • 유니버셜 링크(universal link)를 통한 openURL이 개선되었음 - 비동기 처리, 다른 앱 설치 유무 미리 확인 등


Core Data

  • 쿼리 제네레이션(query generation)기능 추가
  • 동시 처리 성능 향상
  • 툴 발전


CloudKit

  • Record sharing 추가로 여러 사용자가 하나의 기록에 공동으로 접근가능
  • UICloudSharingController을 통해 문서 등의 여러사용자 협업관리를 수월하게 할 수 있음


NSUserActivity

  • NSUserActivity에 위치 정보 추가 가능


App Search

  • 스포트라이트검색의 Search in App 버튼을 통해 앱 내의 검색으로 바로 진입하여 이어갈 수 있음 - CoreSpotlightContinuation


CoreSpotlight Search API

  • 스포트라이트 인덱스를 개방하여 스포트라이트에서 애플리케이션 내부의 컨텐츠 뿐만 아니라 데이터도 검색할 수 있도록 변경


ReplayKit

  • ReplayKit을 사용하여 라이브 스트리밍을 할 수 있음


SceneKit

  • 새로운 렌더링 엔진 - 물리 기반 렌더링
  • iOS 9에 비해 비약적으로 발전


Apple Pay

  • 사용자가 iOS와 워치 뿐만 아니라, 웹에서도 애플페이를 사용할 수 있게 됨
  • 사파리에서도 애플페이를 지원(SFSafariViewController에서 애플페이를 지원가능)
  • UI가 아닌 익스텐션에서도 애플페이 사용가능





* 잘못되거나 부족한 내용이 있다면 덧글 남겨주시면 감사하겠습니다.

* What's New in Cocoa Touch [Session 205]의 나머지 내용은 다음 포스팅에서 이어집니다.


이어지는 다음 포스팅 내용


# Integrating with iOS

  • Keyboards Extensions
  • Widgets
  • User Notifications
  • CallKit
  • SiriKit
  • Intents Extensions
  • IntentsUI Extensions
  • Intents are Shared
  • iMessage Apps

2017/01/04 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 3/4



by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/


p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   



저작자 표시 비영리 변경 금지
신고
Posted by yagom


What's New in Cocoa Touch

WWDC 2016 - Session 205 



WWDC 2016 세션 205의 주제인 What's New In Cocoa Touch 요약정리입니다.

이 포스트는 세션 205요약 중 두 번째 글입니다.


지난 포스팅

  1. 2016/08/13 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 1/4


이번 포스팅에선 아래 주제를 정리하고, 나머지 주제는 다음 포스팅에서 이어집니다.


# Building better user interfaces

  • Accessibility Inspector
  • Speech Recognition
  • Smarter Text Input
  • Dynamic Type
  • Improved Customization
  • Peek & Pop
  • Refresh Control
  • Collection View
  • Advanced in UIKit Animations



# Building better user interfaces

iOS 10에서 유저와 앱 간의 상호작용(interaction) 그리고 유저 인터페이스(UI)에 대해 생각해 봅니다.

가장 먼저 생각해 볼 것은 모든 사람이 여러분의 애플리케이션과 상호작용을 할 수 있도록 만드는 것입니다.


  • Accessibility Inspector
  • UI 요소의 접근성 프로퍼티를 곧바로 파악하고 연결할 수 있습니다.


    기기 또는 시뮬레이터에서 애플리케이션의 접근성 평가를 확인할 수 있습니다. 이를 통해 접근성 문제를 해결할 힌트를 얻을 수 있습니다.




  • Speech Recognition
  • 새로운 제스쳐와 음성 인식으로도 애플리케이션과 상호작용 할 수 있게 되었습니다. 

    간단한 API로 영어 뿐만 아니라 다른 언어도 인식합니다.


    SFSPeech 클래스를 통해 음성인식을 할 수 있습니다. 

    오디오 파일 또는 실시간 오디오 스트림에도 사용할 수 있습니다. 실시간 음성 분석이 가능하다는 뜻입니다.

    요청(request)를 통해 받아쓰기나 문자열을 통한 인식을 하도록 할 수 있습니다.

    결과(result)를 통해 콜백 받습니다. 쓰기 쉽대요.




  • Smarter Text Input
  • 텍스트 필드에 컨텐츠의 종류에 대해 정보를 추가할 수 있습니다. 이를 통해 빠른 입력을 지능적으로 제시할 수 있도록 할 수 있죠.

    예를 들어, 위치에 관련된 텍스트 필드라면 빠른 입력에서 주소를 볼 수 있습니다. 

    이메일, 전화번호, 신용카드 번호 등의 컨텐츠 종류를 표현할 수 있습니다.



  • Dynamic Type
  • iOS 7에서 추가된 동적 타입(dynamic type)의 기능이 iOS 10에서 더 추가되었습니다.

    동적 타입을 위해 컨텐츠 사이즈 카테고리를 만들었습니다.

    iOS 10 이전에는 컨텐츠 사이즈 카테고리는 UIApplication의 프로퍼티였습니다.

    사용자가 컨텐츠 사이즈를 변경하거나 하면 그에 대응하기 위해 노티피케이션을 수신하고 있어야 했습니다. 그렇지만 이제는 하나의 특성(trait)으로 통합되었기 때문에 노티피케이션을 수신할 필요가 없습니다.

    이제는 동적 타입을 익스텐션으로 사용이 가능합니다. 



    iOS 10에서는 UIKit에 이전부터 존재하던 관련 요소들에도 동적 타입을 적용하였습니다.

    텍스트와 관련된 UI 요소인 텍스트 필드, 텍스트 뷰, 레이블 등이 컨텐츠 사이즈 카테고리를 위한 글꼴 적용을 사용할 수 있게 되었습니다.



  • Improved Customization
  • UIKit에 사용자화(커스터마이징)이 대폭 추가되었습니다. 바 버튼 아이템이 그 좋은 예가 되겠습니다.

    탭바 아이템에 배치 색상을 사용자화 할 수 있으며, 텍스트에 속성(attributes)를 추가할 수 있습니다. 선택되지 않은 상태의 색상을 변경할 수도 있습니다.



  • Peek & Pop
  • 웹뷰에도 또 다른 방법으로 사용자화가 가능하게 되었습니다.

    3D 터치를 이용한 Peek & Pop 기능을 뷰컨트롤러를 위한 UIKit의 간단한 API만으로 추가할 수 있습니다. WKWebView에도 이런 기능이 추가되었습니다.

    웹뷰에서도 Peek & Pop을 좀 더 쉽게 제어할 수 있습니다. 다시 말해서 Peek 할 때 사용하는 뷰 컨트롤러를 사용자화 할 수 있습니다. Peek을 하면 미리보기를 할 수 있고, Pop을 하면 여러분의 앱 안에서 무슨 처리를 할 지 결정할 수 있습니다. 웹뷰 클래스의 델리게이트 메서드를 통해 이런 일들을 처리할 수 있습니다.

    UIKit에서 Peek & Pop 동작을 할 때, 블러 효과같은 기본적인 효과 외에도 사용자가 Peek 하려는 것을 감지하고, 어떤 행위를 할 것인지 감지해서 여러분만의 전환효과를 줄 수 있습니다. 



  • Refresh Control
  • Refresh Control을 UIScrollView와 그 자식 클래스에서 모두 사용할 수 있습니다. 즉, UITableView에만 제공되었던 기본적인 refresh control을 콜렉션 뷰를 포함한 여러 스크롤 환경에서 사용할 수 있게 되었다는 뜻입니다.



  • Collection View
  • 작년에는 콜렉션뷰의 flow layout의 새로운 모드가 생겼습니다. 자동 모드를 사용하면 더이상 셀의 크기를 예상하기 위하여 계산하지 않아도 됩니다. 또한, 스크롤뷰의 페이징 기능을 사용할 때 셀을 재정렬(reordering)하는 기능을 구현하였습니다.

    올해는 더욱 부드러운 스크롤을 위해 새로운 기능이 추가되었습니다.

    만약 셀에 복잡한 정보를 나타내야 할 때에는 빠른 스크롤을 하게된다면 버벅일 수 있었는데, 이는 사용자 경험으로 좋지 못하죠.

    그래서 cell prefetching 기능을 추가했습니다. 셀이 화면에 나타나기 전에 셀과 데이터를 미리 로드해 둘 수 있습니다. 물론 언제 어떻게 불러올지는 자동으로 모두 처리됩니다.  

    iOS 10으로 빌드한다면 셀을 미리 불러오는 것들은 자동으로 처리될 것입니다. 그렇지만 데이터를 미리 로드해 오는 것은 새로운 델리게이트 프로토콜 메서드를 통해 구현해 주어야 합니다.

    (테이블뷰에도 이런 기능이 추가되었습니다)


  • Advanced in UIKit Animations
  • UIViewPropertyAnimator라고 불리는 애니메이션 관련 기능이 추가되었습니다. 이는 새로운 애니메이션 API입니다.

    취소할 수 있고, 되감을 수 있으며, 타이밍을 정할 수 있으며, 완벽히 동적으로 동작합니다.



    애니메이션을 동영상의 타임라인처럼 관리를 할 수 있습니다. 

    타이밍과 동작시간을 매개변수로 전달하여 애니메이션에 추가할 수 있습니다.

    애니메이션 객체가 애니메이션을 표현하게 됩니다. 동작 중에 다양한 변화를 추가하거나 수정할 수 있습니다.

    뷰컨트롤러 작동 시스템에 완벽하게 녹아들어가 있습니다.

    이 새로운 애니메이션 기능의 강력한 포인트는 애니메이션을 사용자와 직접 상호작용 할 수 있도록 구현할 수 있다는 점입니다.



    # 간단요약

    Accessibility Inspector

    • 내 앱에 사용자 접근성 사용 기능이 어떤 것이 적용되어 있는지를 개발자가 더욱 편리하게 확인할 수 있는 기능이 추가됨


    Speech Recognition

    • 오디오 또는 실시간 입력으로도 음성인식 기능을 사용할 수 있음
    • 영어 외에 다른 나라 언어도 많이 지원함


    Smarter Text Input

    • 텍스트필드에 입력될 데이터가 어떤 종류인지 지정해두면 사용자가 원하는 데이터를 더 편리하게 입력할 수 있도록 도와줌


    Dynamic Type

    • 컨텐츠 사이즈 카테고리에 따라 글꼴 등을 알아서 표현해 줌


    Improved Customization

    • UIKit에 사용자화(커스터마이징) 할 수 있는 영역이 대폭 추가됨 (바 버튼 아이템의 여러 속성 등)


    Peek & Pop

    • 3D 터치를 통한 미리보기 기능의 전환효과를 사용자화 할 수 있음


    Refresh Control

    • Refresh Control을 테이블뷰 외에도 UIScrollView의 모든 자식클래스에서 사용할 수 있게 됨


    Collection View

    • 페이징 할 때 등 flow layout이 개선됨
    • 데이터를 미리 불러와 두고 처리해 둠으로써 콜렉션뷰를 조금 더 쾌적하게 사용할 수 있도록 개선


    Advanced in UIKit Animations

    • 애니메이션을 손쉽고 유려하게 다룰 수 있는 많은 기능이 추가됨
    • 애니메이션 표현 정보를 객체로 다룰 수 있게 되었고 손쉽게 사용자와 상호작용(interaction) 할 수 있음






    * 잘못되거나 부족한 내용이 있다면 덧글 남겨주시면 감사하겠습니다.
    * What's New in Cocoa Touch [Session 205]의 나머지 내용은 다음 포스팅에서 이어집니다.

    이어지는 다음(그리고 그 다음) 포스팅 내용

    # Adopting system features

    # Integrating with iOS


    2016/12/16 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 3/4

    2017/01/04 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 3/4





    by yagom

    facebook : http://www.facebook.com/yagomSoft

    facebook group : https://www.facebook.com/groups/yagom/


    p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

    RSS Feed 받기   



    저작자 표시 비영리 변경 금지
    신고
    Posted by yagom


    What's New in Cocoa Touch

    WWDC 2016 - Session 205 


    WWDC 2016 세션 205의 주제인 What's New In Cocoa Touch 요약정리입니다.

    이 포스트는 세션 205요약 중 첫 번째 글입니다.

    이번 포스팅에선 아래 주제를 정리하고, 나머지 주제는 다음 포스팅에서 이어집니다.


    # What's Not New in Cocoa Touch

    • Adaptivity
    • Advanced Touch Input
    • Keyboard Support

    # Core technologies

    • Swift 3
    • Grand Central Dispatch
    • Foundation
    • UIPasteboard
    • Wide Color
    • Image Renderer
    • Asset Management






    # What's Not New in Cocoa Touch

    작년에 변경된 코어한 내용들에 대한 소개입니다.



    작년에 3D Touch를 탑재한 iPhone 6s를 출시. 12.9인치 및 9.7인치 iPad Pro 출시. 애플 펜슬 및 스마트 키보드 출시.

    이런 제품들은 새로운 기능들을 앱에 유려하게 넣을 수 있도록 기능이 추가되었습니다.


  • Adaptivity
    • 2년 전 사이즈 클래스 기반의 반응형 기술을 소개했습니다. iPhone은 Compact 사이즈, iPad는 Regular 사이즈입니다. 그러면 iPad Pro는 Gigantic(거대)사이즈를 적용해야 할까요?



      당연히 아니겠죠. 사이즈 클래스가 중요해진 만큼 그를 지원하는 많은 툴들이 보강되었습니다. 인터페이스 빌더를 비롯하여 오토 레이아웃과 에셋 카탈로그까지 프레임워크 전반적으로 새로운 기능들이 보강되었습니다. 


    • Advanced Touch Input
      • iPad Air 2와 iPad Pro는 화면 재생 빈도(screen refresh rate)보다 빠르게 터치 입력 스캐닝을 120 HZ로 할 수 있습니다.

        방향과 각도도 파악할 수 있고, 더 정확한 위치와 압력을 인식할 수 있는 애플 펜슬응 사용할 수 있습니다. iPhone 6s에서는 이를 3D Touch 기술을 이용하여 인식할 수 있습니다.

        위 기능들을 사용하기 위해 iOS 9 및 iOS 9.1에서 새로운 API를 사용할 수 있었습니다.



        • Keyboard Support

        키보드 단축키 API는 iOS 7 부터 사용할 수 있었지만, iOS 9 부터는 단축키를 화면에 자동으로 표시할 수 있는 기능이 추가되었기 때문에 더욱 중요해 졌다고 할 수 있습니다. 커맨드 키를 계속 누르고 있으면 자동으로 단축키를 화면에 표시해줍니다.


        # What's New in Cocoa Touch

        이번 iOS 10에 변경된 내용들에 대한 소개입니다.



        Core technologies

        이번 iOS 10에 변경된 중요한 내용들에 대한 소개입니다.



        • Swift 3


        Before - Swift 2.2


        After - Swift 3.0

        거의 모든 API가 새로워졌습니다.
        Objective-C의 문법에서 Swift의 문법으로 변환하는 규칙을 변경하였습니다. 첫 번째 파라메터 이름을 사용하게 변경하여 좀 더 명확하게 표현할 수 있으며, (UIColor의 blackColor가 black으로 변경된 것처럼) 타입 메서드 이름이 타입 이름과 중복되던 현상을 줄일 수 있습니다.

        코어 그래픽(Core graphics) 메서드도 좀 더 쓰기 용이하게 변경되었습니다.

        GCD(Grand central dispatch)가 이제 완전한 객체형 API로 변경되었습니다.

        • Grand Central Dispatch

        개인 큐(private queue)를 생성할 수 있습니다. 큐 작업 아이템이 동기로 실행될 때, 오토 릴리즈 풀에 있는 각각의 작업 아이템을 래핑할 수 있도록 큐를 설정할 수 있습니다.  


        • Foundation

        Foundation도 스위프트의 발전 사항을 많이 적용하였습니다. 많은 클래스에서 NS 접두어를 없애고 새로운 기능을 추가했으며, Foundation API에 값 타입(Value types)를 더 추가했습니다.


        길이나 측량 단위도 모두 지원합니다. 

        AP 601 날짜 형식(Date format)도 추가했습니다.

        NSDateInterval을 통해 날짜를 계산하기 더 편리해졌습니다.

        • UIPasteboard

        UIPasteboard API를 사용하여 여러분의 앱에서 Mac과 iOS 기기 간에 복사/붙여넣기 영역을 공유할 수 있습니다. 

        한 가지 알아두어야 할 점이 있습니다. 큰 이미지 등과 같이 매우 큰 에셋을 가져오려면 1~2초 정도 걸릴 수 있습니다. 이를 피하려면, 그 데이터가 필요한지 아닌지를 먼저 판단해 주어야 합니다. API를 통해 URL, 이미지, 색상 등의 정보가 있는지 먼저 확인해 볼 수 있습니다. 


        pasteboard로 어떤 정보들을 실어 보낼지 제어할 수 있습니다. 데이터를 보호할 수도 있고, 만료시각을 설정할 수도 있습니다.


        • Wide Color

        iMac의 5K 화면 및 iPad Pro 9.7 인치의 하드웨어에 적용될 수 있는 기능입니다. 기존 하드웨어에서는 표현할 수 없었던 색상을 표현할 수 있습니다.

        색상을 표현하는 방법을 변경하고 있습니다. iOS 기기는 sRGB 색상을 사용했습니다. 이제는 확장된 sRGB(extended sRGB)를 사용합니다.

        iOS 10 API를 사용하여 확장된 색상을 사용할 수 있습니다.



        확장된 색상을 사용하는 그 첫 번째는 UIImageView입니다.  단순히 UIImageView를 사용하는 것으로도 광역 색상(wide color)을 사용합니다. 사실 iOS 9.3부터 그렇게 관리되어왔습니다. 



        기존에 존재하던 이니셜라이저 외(init(red: green: blue: alpha:))에 새로 하나(init(displayP3Red: green: blue: alpha:))가 추가되었습니다. 

        상단의 이니셜라이저로 확장된 sRGB 색상을 표현할 수 있습니다.

        당신이 광역 색상(wide color) 스펙으로 displayP3를 사용하려면 하단의 displayP3 이니셜라저를 사용하면 됩니다. 따로 색 공간(color space)를 관리하는 클래스는 없습니다.


        • Image Renderer

        이제까지 여러분은 이미지 UIGraphicsBeginImageContext를 사용하여 이미지 랜더링을 하고 있었습니다. 이런 방식은 이미지를 화면 밖에서 랜더링 한다는 문제점이 있었습니다.

        이 방법은 32비트 sRGB만 사용할 수 있습니다. 확장이 용이하지 못하고 좋지 못한 API의 형태였습니다.



        그래서 UIGraphicsRenderer 클래스를 만들었습니다. 

        이 클래스를 사용하면 9.7인치 iPad에서는 광역 색상 컨텍스를, 다른 기기에서는 기존 색상 컨텍스를 자동으로 판단하여 사용합니다. 

        또한, 블럭을 기반으로 설계되어 사용하기 쉽습니다. 또, 객체 기반 API로 설계하였기 때문에 이미지와 PDF를 위한 클래스를 늘렸습니다.

        또 중요한 점은 이 클래스는 컨텍스트의 활동시간(lifetime)를 관리합니다. 메모리 관리가 훨씬 용이해 졌다는 뜻이겠죠.

        • Asset Management

        이미지 에셋 카탈록에도 새로운 기능이 추가되었습니다. 에셋 카탈록이 광역 색상을 지원하고, 좌에서 우, 우에서 좌의 표현, 그리고 이미지 압축을 관리합니다. UIKit 시스템에 포함되어 있습니다.


        여러분의 애플리케이션에 광역 색상 에셋을 포함시켰을 때, 광역 색상을 사용하지 않는 기기에는 배포되지 않도록 구성할 수 있습니다. 또, 그런 기기로 배포하기 위해 sRGB로 자동으로 변형하여 주게됩니다. 이는 App Thinning 기능과 호환되어 적절한 에셋이 적용될 수 있도록 하여 앱을 더욱 가볍게 만들어 줄 수 있습니다.


        기기에 따라 이미지를 손실압축 할 수 있습니다. 용량과 화질 사이의 최상의 타협점을 찾아냅니다. 이 또한 App Thinning 기능과 호환됩니다.


        이미지마다 왼쪽읽기 및 오른쪽읽기에 따라서 이미지가 반전 되어야 하는지 아닌지를 지정할 수 있습니다.




        * 잘못되거나 부족한 내용이 있다면 덧글 남겨주시면 감사하겠습니다.
        * What's New in Cocoa Touch [Session 205]의 나머지 내용은 다음 포스팅에서 이어집니다.

        이어지는 다음(그리고 그 다음) 포스팅 내용

        # Building better user interfaces

        # Adopting system features

        # Integrating with iOS


        2016/09/05 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 2/4

        2016/12/16 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 3/4

        2017/01/04 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 3/4




        by yagom

        facebook : http://www.facebook.com/yagomSoft

        facebook group : https://www.facebook.com/groups/yagom/


        p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

        RSS Feed 받기   

        저작자 표시 비영리 변경 금지
        신고
        Posted by yagom


        티스토리 툴바