2018년 5월 25일 금요일

[구름IDE]에서 Swift 프로그래밍 하기 & Swift4 적용

1) 회원가입 및 로그인

* 구름 IDE 계정 필요



https://ide.goorm.io/  <<- 여기서 회원가입


2) 대시보드



  <대시보드 이동 후>





3) 컨테이너 생성























  소스, 이름, 설명 입력  '소프트웨어 스택 선택에서 Swift 선택'
  (우측 하단에 Swift 언어에 대한 설명표시 <3.1.1>)



4) 생성하기




5) 생성된 컨테이너 모습



 프로그래밍 하시면 됩니다.



< Swift4 적용하기>
구름 IDE 에서는 'Swfit4'를 지원하지 않기 때문에 따로 설치 작업이 필요합니다

하단에 있는 터미널에 아래처럼 입력해 줍니다.

cd /goormService

wget http://swift.org/builds/swift-4.0.2-release/ubuntu1404/swift-4.0.2-RELEASE/swift-4.0.2-RELEASE-ubuntu14.04.tar.gz

mkdir swift

tar -xzf swift-4.0.2-RELEASE-ubuntu14.04.tar.gz -C swift --strip-components 1

rm swift-4.0.2-RELEASE-ubuntu14.04.tar.gz

echo "export PATH=/goormService/swift/usr/bin:/$PATH">>~/.profile

 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년 10월 27일 금요일

Data Type : enum(열거형) @@ Swift4.0

enum(열거형)


열거형은 연관된 항목들을 묶어서 표현할 수 있는 타입
열거형은 배열이나 딕셔너리 같은 타입과 다르게 프로그래머가 정의해준 항목 값 외에는 추가/ 수정이 불가능
* switch 구문과 함께 사용할때 유용하게 사용할 수 있습니다.


열거형을 사용하는 경우

 - 제한된 선택지를 주고 싶을때
 - 정해진 값 외에는 입력받고 싶지 않을때
 - 예상된 입력 값이 한정되어 있을때


기본선언

enum School{
    case primary
    case elementary
    case middle
    case high
    case college
    case university
    case graduate
}

또는 "," 를 이용해 한줄로 표현

enum School {
    case primary, elementary, middle, high, college, university, graduate
}


열거형 변수의 생성 및 값 변경

var types : School = School.primary

var typeName : School = .graduate

typename = .elementary


열거형의 원시 값(Raw Value) 지정과 사용

enum Schooltype : String{
    case primary = "유치원"
}

let schoolNameText = Schooltype.primary
print("저의 학교는 \(schoolNameText.rawValue) 입니다")   //   "저의 학교는 유치원 입니다." 


열거형의 원시 값 일부 지정 및 자동 처리
일부 항목만 원시 값을 적용 시 나머지 값은 스위프트에서 알아서 자동처리

enum Numbers : Int{
    case zero
    case one
    case two
    case ten = 10
}

print(Numbers.zero.rawValue)   // 0
print(Numbers.ten.rawValue)  //  10


열거형 초기화
원시 값 정보를 알 경우 원시 값을 통해 열거형 변수 또는 상수를 생성, 올바르지 않는 원시 값을 통해  생성하려고 하면 nil 반환

enum Numbers : Int{
    case zero
    case one
    case two
    case ten = 10
}

let newNumber = Numbers(rawValue : 0)  // zero
var noneNumber = Numbers(rawValue : 4)  //  nil


 연관 값

enum MainDish{
    case pasta(taste : String)
    case pizza(dough : String, topping : String)
}

var dinner : MainDish = MainDish.pasta(taste: "크림")  //  pasta("크림")
dinner = .pizza(dough: "치즈크러스트", topping: "불고기")   //  pizza(dough: "치즈크러스트", topping: "불고기")

*순환열거형

indirect 키워드 사용

- 특정 항목에 순환 열거형 항목 명시 
   case 키워드 앞에 
   enum AriExpression{
      case number (Int)
      indirect case add (AriExpression, AriExpression)
   }

- 열거형 전체에 순환 열거형 명시
   enum 키워드 앞에
  indirect enum AriExpression{
      case number (Int)
      case add (AriExpression, AriExpression)
    }




출처 : 야곰님의 스위프트 프로그래밍


2017년 10월 22일 일요일

Data Type : 세트(Set) @@ Swift 4.0

세트 (Set)


세트는 같은 타입의 데이터를 순서 없이 하나의 묶음으로 저장하는 형태의 컬렉션 타입입니다.
세트 내의 값은 모두 유일한 값, 즉 중복된 값이 존재하지 않습니다.

*순서가 중요하지 않거나 각 요소가 유일한 값이어야 하는 경우에 사용

1. 세트의 선언과 생성

//  빈 세트의 생성
var emptySet : Set<String> = Set<String>()
var emptySet : Set<String> = []

// 대괄호를 이용해 초기화
var names : Set<String> = ["name1", "name2", "name3","name4"]

*Array에서 사용가능한 축약형(Array<Int>  -> [Int])이 Set에서는 불가능 사용 불가능 
 var names : String = ["name1", "name2", "name3","name4"]
 print(type(of: names))  // Array<String>

위 축약형을 사용할 경우 타입 추론에 의해 컴파일러는 Set 가 아닌 Array로 타입을 지정합니다.

2. 프로퍼티 

isEmpty  //  빈 값 체크 (Bool)
count  // 중복된 값은 허용하지 않아 카운팅 되지 않습니다.

3. 추가 및 삭제
// 추가
names.insert("name5")

// 삭제
names.rem("name5")


4. 세트의 활용 

- 집합 연산-

let englishClassStudent : Set<String> = ["john", "chulsoo", "yagom"]
let koreaClassStudent : Set<String> = ["jenny", "yagom", "chulsoo", "haha", "minsoo"]

<교집합>
let intersectSet : Set<String> = englishClassStudent.intersection(koreaClassStudent)
print(intersectSet)  //  ["yagom", "chulsoo"]

<여집합의 합>
let symmetricDiffSet : Set<String> = englishClassStudent.symmetricDifference(koreaClassStudent)
print(symmetricDiffSet)  //  ["john", "haha", "minsoo", "jenny"]

<합집합>
let unionSet : Set<String> = englishClassStudent.union(koreaClassStudent)
print(unionSet)  //   ["john", "yagom", "chulsoo", "haha", "minsoo", "jenny"]

<차집합>
let subtractSet : Set<String> = englishClassStudent.subtracting(koreaClassStudent)
print(subtractSet)  //  ["john"]


- 포함관계 연산 - 

print(새.isDisjoint(with: 포유류))   //  서로 베타적인지 - true

print(새.isSubset(of: 동물))   //  새가 동물의 부분집합 인가 - true

print(동물.isSuperset(of: 포유류))   //  동물은 포유류의 전체 집합인가 - true

print(동물.isSuperset(of: 새))  //  동물은 생의 전체 집합인가 - true


출처 : 야곰님의 스위프트 프로그래밍

추천 게시물

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

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