레이블이 Swift4인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Swift4인 게시물을 표시합니다. 모든 게시물 표시

2017년 11월 10일 금요일

iTunes File Sharing (iTunes 파일 공유) @@ in Swift4.0 - Xcode9.0 iOS11

iTunes File Sharing 을 하면 디바이스를 iTunes 와 연결했을때 어플리케이션의 도큐멘트에 접근하여 공유할 수 있는 공유폴더를 사용할 수 있다.



1. info.plist 권한 수정

info.plist를 열어 아래 이미지 처럼 "Application supports iTunes file sharing" 키값을 추가하고
"YES"로 변경합니다. 




2. iPhone을 Mac에 연결하십시오. 아이튠즈 실행 (iPhone에 테스트용 어플리케이션을 설치했는지 확인)

3. 기기를 클릭 한 다음 왼쪽 메뉴 옵션에서 '앱'을 클릭합니다. > 파일 공유 선택하고 드래그하여 파일을 추가

4. 코드를 작성, 디버깅하여 어플리케이션의 도큐멘트에 복사된 파일이 추가 된 것을 확인

<참고 코드>
// 앱 도큐멘트 파일 리스트 확인
let fileManager = FileManager.default
do {
//도큐멘트 파일 경로를 가져옵니다.
let destPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
// 접근한 경로의 디렉토리 내 파일 리스트를 불러옵니다.
let items = try fileManager.contentsOfDirectory(atPath: destPath)
print("Count \(items.count)")
  for item in items {
    print("Found \(item)")
  }
} catch {
  print("Not Found item")
}



2017년 11월 2일 목요일

Property(프로퍼티) - Lazy Stored Properties (지연 저장 프로퍼티) @@ Swift4.0

지연 저장 프로퍼티 (Lazy Stored Properties)

1.정의

지연 저장 프로퍼티(lazy stored property)는 처음 사용 할때 까지 초기 값이 계산되지 않은 프로퍼티 입니다. 지연 저장 프로퍼티는 호출이 있어야 값을 초기화 하며 선언할때 앞에 lazy를 작성하여 나타냅니다.

* 지연 저장 프로퍼티는 인스턴스 초기화가 완료될때까지 초기 값을 가져올 수 없기 때문에, 항상 변수(var키워드 사용)로 선언해야 합니다. 상수 는 인스턴스가 완전히 생성되기 전에 초기화 해야 하므로 필요할때 값을 할당하는 지연 저장 프로퍼티와는 맞지 않습니다.

2.특징

 - 지연 저장 프로퍼티는 주로 복잡한 클래스나 구조체를 구현할 때 많이 사용

 - 외부요인에 의해 초기화가 완료될때가지 값을 알 수 없는 프로퍼티의 값을 초기화 할때 유용

 - 필요한 경우가 아니면 그때까지 수행되서는 안되는 복잡하거나 계산이 오래걸리는 프로퍼티가 필요한 경우 유용

 - 지연 저장 프로퍼티를 잘 사용하면 불필요한 성능저하나 공간 낭비를 줄일 수 있습니다.

<예제코드>

class DataImporter {

  var fileName = "data.txt"

}

class DataManager {

lazy var importer = DataImporter()

var data = [String]()

}

let manager = DataManager()

manager.data.append("Some data")

manager.data.append("Some more data")

// 이 코드를 통해 프로퍼티에 접근할때 importer 프로퍼티의 DataImporter가 생성됨


print(manager.importer.fileName)

주의!
다중 스레드 환경에서 지연 저장 프로퍼티에 동시다발적으로 접근할 때에는 한번만 초기화 된다는 보장이 없습니다. 생성되지 않은 지연저장 프로퍼티에 많은 스레드가 비슷한 시점에 접근한다면, 여러번 초기화 될 수 있습니다.


출처 : 야곰님의 스위프트 프로그래밍
출처 : http://kka7.tistory.com/88

Property(프로퍼티) - Stored Property (저장 프로퍼티) @@ Swift4.0

저장 프로퍼티 

- 구조체 -
struct S_Point {
  var x : Int
  var y : Int
}

// 구조체는 기본적으로 저장 프로퍼티를 매개변수로 갖는 이니셜라이저가 있습니다. 
let testPoint = S_Point(x: 10, y: 10)

- 클래스 -
class Position{
  var point : S_Point // << stored property 'point' without initial value prevents synthesized initializers 컴파일 에러 발생 

  let name : String // << stored property 'name' without initial value prevents synthesized initializers 컴파일 에러 발생

// 프로퍼티 기본값이 지정되어 있지 않다면 이니셜라이저를 따로 정의해주어야 합니다. 정의하지 않으면 위 컴파일 에러 발생 

  init(name : String, currentPoint : S_Point) {
    self.name = name
    self.point = currentPoint
  }
// 이니셜라이저 정의 후 컴파일 에러 사라짐 
}

// 이니셜라이저를 호출함으로써 초기값을 할당해야 인스턴스가 생성됩니다. 
let testPoint2 = Position(name: "tester", currentPoint: testPoint)

구조체는 프로퍼티에 맞는 이니셜라이저를 자동으로 제공하지만 클래스는 그렇지 않습니다. 하지만 클래스의 저장 프로퍼티의 초기값을 지정해주면 따로 이니셜라이저를 구현하지 않아도 됩니다.


class CustomPosition {
  var name : String = "tester" // << 초기값을 지정했기 때문에 이니셜라이저 없어도 컴파일 에러 발생 안함
  var age : Int? // 인스턴스 생성 시 프로퍼티에 값이 필요 없다면 프로퍼티를 옵셔널로 선언가능
}

let customName : CustomPosition = CustomPosition()
print(customName.name) // "tester" 출력
print(customName.age) // "nil" 출력

// 옵셔널 프로퍼티의 값을 알게 되었을때 할당
customName.age = 10
print(customName.age) // "Optional(10)"
print(customName.age!) // 옵셔널 벗기기 "10"

Property(프로퍼티) - 정의, 종류 @@ Swift4.0


1. 정의

프로퍼티 : 클래스, 구조체 또는 열거형 등에 관련된 값을 뜻함
메서드 : 특정타입에 관련된 함수

struct FixedPoint{
  var firstPoint : Int // << 프로퍼티
  let secondPoint : Int
}

var rangePoint = FixedPoint(firstPoint: 10, secondPoint: 10)
rangePoint.firstPoint = 11
// rangePoint.secondPoint = 11  >> 컴파일 에러 (let secondPoint 상수는 값 변경 안됨)

let rangePoint2 = FixedPoint(firstPoint: 20, secondPoint: 20
// rangePoint2.firstPoint = 22 >> 컴파일 에러 ( let rangePoint2 상수는 값 변경 안됨)


2.프로퍼티 종류

 저장 프로퍼티 (Stored Property) : 인스턴스의 변수 또는 상수, 구조체와 클래스에서만 사용가능

 연산 프로퍼티 (Computed Property) : 특정 연산을 실행한 결과값, 클래스, 구조체, 열거형에 사용

 타입 프로퍼티 (Type Property) : 특정타입에 사용

* 프로퍼티 감시자 : 프로퍼티의 값이 변할 때 값의 변화에 따른 특정 액션을 실행합니다.


2017년 8월 7일 월요일

Data Type : Dictionary - 딕셔너리 (사전) @@ Swift 4.0

딕셔너리

딕셔너리는 키와 값으로 구성된 요소를 순서 없이 저장하는 컬렉션입니다.
사전과 유사한 구조를 가지고 있으며 키는 단어, 값은 뜻으로 비유할 수 있습니다.

*키 값은 딕셔너리에서 값을 유일하게 식별해야 하기 때문에 하나의 딕셔너리에는 중복된 키가 
존재할 수 없습니다.

1. 종류

 Foundation 컬렉션 : NSDictionary, 가변클래스인  NSMutableDictionary 제공
   - 문자열 키를 사용 하며 저장되는 객체의 자료형 제한을 하지 않음
 Swift 컬렉션에선 Dictionary
   - 참조형식과 값 형식을 모두 저장, 요소의 자료형이 동일해야됨


2. 딕셔너리 기본 구조

  [키1 : 값1, 키2 : 값2, 키n : 값n]
  [:] // 빈 딕셔너리


3. 선언과 초기화

// Swift Dictionary
 let dictionary = ["a" : "SYD", "b" : "LHR", "c" : "GMP"]

// Foundation Dictionary 
 let nsWords : NSDictionary = ["a" : "SYD", "b" : "LHR", "c" : "GMP"]


4. 빈 딕셔너리 선언

 // Swift Dictionary
 let dictionary1 : Dictionary<String, String> = [:]
 let dictionary2 : [String : String] = [:]
 let dictionary3 = [String : String]()

 // Foundation Dictionary 
 let nsDic = NSMutableDictionary()

5. 딕셔너리 요소의 수

 let dictionary = ["a" : "SYD", "b" : "LHR", "c" : "GMP"]
 let dictionaryCount = dictionary.count


6. 요소에 접근

 var dictionary = ["a" : "SYD", "b" : "LHR", "c" : "GMP"]

  - 읽어오기
     let readingDic =  dictionary["a"]  // readingDic = "SYD"
  - 값 업데이트
     dictionary["a"] = "Sydney"
     dictionary.updateValue("updateString", forKey: "b") //메소드 사용
  - 지우기
     dictionary["a"] = nil
     dictionary.removeValue(forKey: "b") //메소드 사용
  
    
 7. 프로퍼티

  isEmpty // 빈 값 = true
  count  //   요소 개수 확인






2017년 7월 27일 목요일

변수(Variables) 와 상수(Constants) @@ Swift4.0


1. 변수 - Mutable (변하는 값)

저장된 값을 마음대로 변경할 수 있는 요소입니다.
변수의 이름과 저장할 값의 크기를 선언하면 메모리에 변수를 위한 저장공간이 생성됩니다.
var 사용하여 변수 선언

  var 변수이름 : 자료형
  ex) var a : Int


만일 변수의 수가 많고 동일한 자료형을 가지고 있다면 한줄에 여러 개의 변수를 선언

  var 변수1, 변수2, 변수3..변수n:Int
  var a, b, c: Int



다른 자료형의 변수 선언 시

  var a: Int, b:Float, c:String

변수 초기화
: 값을 최초로 저장하는 것을 초기화 라고 합니다.
* 변수를 선언한 후엔 반드시 적절한 값으로 초기화 해야합니다!

  var 변수이름 : 자료형 = 초기값
  var a : Int = 0





2. 상수  - Immutable (변하지 않는 값)

상수는 변수와 매우 유사하지만 초기값을 할당한 후에 값을 변경할 수 없습니다.
let 을 사용하여 상수 선언

선언과 초기화

  let 상수이름 : 자료형 = 초기값

  ex)상수 a 선언과 100으로 초기화
  let a : Int = 100


*상수값 변경 시 컴파일 에러 발생


  let a:Int // 상수 선언
  a = 0 // 초기화
  let b = a // 컴파일 에러 발생


3. 상수를 사용하면 좋은경우

- 파일이나 네트워크를 통해 읽어온 값을 변경 없이 사용 시

- 여러 소스를 함께 사용하는 고정값을 저장 시

- 여러 스레드에서 동시 접근해야 하는 값

- 컴파일러 최적화를 통해 더 나은 성능을 얻고 싶을 시

이 외엔 변수 사용


4. 변수, 상수 이름 정의 규칙

1. 띄어쓰기 안됨
2. CamelCase (낙타표기법) : 첫글자는 소문자로 시작, 첫번째 단어를 제외한 모든 단어의 첫 문자를 대문자 사용 
ex) let programmingLanguage = "swift"
3. 숫자로 시작 안됨
4. 공백사용 안됨
5. 수학적 기호 사용 안됨

























2017년 7월 12일 수요일

WWDC 2017 샘플코드 한번에 받기



터미널 실행 gem 을 설치 하고 아래 명령어 입력 (둘중하나)

$ gem install wwdcdownloader

$ sudo gem install wwdcdownloader



다운로드할 디렉토리를 지정하거나 해당 디렉토리로 이동후  wwdcdownloader 명령입력


$ wwdcdownloader [타겟디렉토리]



추천 게시물

애플 개발자 등록방법 2016년 5월 8일 기준!!

애플 개발자 등록 절차 1. 개발자 등록 페이지 이동    애플 개발자 로그인 > Account 페이지 이동 > 하단 영역 클릭 (이미지 참조)   >> Enroll 클릭 >> 무조건 승인!! ...