2020년 5월 11일 월요일

swift Unable to install issue! -> solution

현재까지 두가지 경우 발견 (둘다 번들아이디를 변경 후 발생함)

1. 기기내 앱의 흔적이 남아있는경우

디버깅 중에 간혹 swift Unable to install 이런 오류가 발생할 경우
해당 디바이스내 기록을 지워주면 해결 된다.

xcode > window

1) Devices and Simulators  실행


2) 해당 디바이스 우클릭! > "Show Provisioning Profiles..." 클릭


3) 에러가 발생하는 프로젝트를 선택 후  " - " 제거!


4) Done을 누른뒤 다시 실행하면 오류가 없어진걸 확인가능!


2. Extension 을 사용시 번들 아이디를 바꿔도 발생

1) 프로젝트에서 하단에 임베드한 위젯을 없애고나서 다시 추가한다.


2) 프로젝트의 설정에서 Build phases 으로 이동




3) 아래 항목을 선택하여




4) 네모칸을 체크 해준다




2020년 3월 9일 월요일

TableView code 로 만들때 꼭 참고 @@ in Swift5.1 - Xcode 11.3.1

var tableView = UITableView()


1. delegate, dataSource 위임

override func viewDidLoad() {
  super.viewDidLoad()

  tableView.delegate = self
  tableView.dataSource = self

}


2. 초기화 init
  code로 tableView 생성 시 자동으로 초기화가 되지 않기 때문에 따로 선언해줘야 한다


override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
  super.init(style: style, reuseIdentifier: reuseIdentifier)

}


required init?(coder aDecoder: NSCoder) {
  fatalError("init(coder:) has not been implemented")
}


3. 레지스터 
 TableViewCell를 변수값에 넣어준다. 안넣을 시 cell 빌더 시 오류 발생

override func viewDidLoad() {
  super.viewDidLoad()
  tableView.delegate = self
  tableView.dataSource = self 

  tableView.register(testTableViewCell.self, forCellReuseIdentifier: "CodingCustomTableViewCell")

}

  1. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
    }
  2. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "testTableViewCell", for: indexPath) as? testTableViewCell else { return UITableViewCell() }
    return cell
  3. }


    }

2020년 2월 24일 월요일

ios framework linker command failed with exit code 1 (use -v to see invocation)


 ios framework linker command failed with exit code 1 (use -v to see invocation) ...
 FrameWork 를 못찾겠다며 뜨는 이슈


왼쪽 framework 폴더에서 붉게 표시된 파일들을 삭제시 해결
붉게 된 표시가 없고 연한 흰색으로 표시도 됨 

2020년 2월 23일 일요일

Mac 업데이트 후 cocoapods 이슈 발생 ..ruby: no such file or directory

zsh: /usr/local/bin/pod: bad interpreter: /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby: no such file or directory

Mac 업데이트 후 생긴 오류

새로 설치하면 해결
터미널 실행 > sudo gem install cocoapods  > pod install 설치

2019년 9월 3일 화요일

Xcode error "The maximum number of apps for free development profiles has been reached" 오류 해결

개발자 계정없이 여러앱을 빌드 하다보면 발생하는 오류
"The maximum number of apps for free development profiles has been reached"


해결방법 (Xcode 10.3)

Xcode -> Window -> Devices and Simulators

하단의 INSTALLED APPS에서 
빌드했던 앱들을 삭제

2019년 6월 26일 수요일

Xcode change Provisioning Profile - 다른 프로비저닝 프로필 적용 (시스템 키체인 암호 입력 창 계속 뜨는 이슈 해결방법 포함) - @@ in Swift4.2.1 - Xcode 10.2.1

다른 프로비저닝 프로필을 가진 프로젝트를 빌드 할때 인증서 문제가 발생합니다.
이를 해결하기 위해선 프로젝트 만들시 사용된 프로비저닝 프로필을 Import 해서 빌드를 해야 합니다.


프로비저닝 프로필 두개 (개발용 배포용)과 인증서 파일 (.p12)  필요

* 프로비저닝 프로필을 만들때 디바이스의 UUID를 사용한다.
Xcode 실행  -> Windows -> Devices and simulators 로 들어가 UUID를 확인





그렇게 만들어진 프로비저닝 프로필 파일 두개와 인증서 파일 (p.12) 를 받았으면
Xcode를 실행하여 프로비저닝 프로필을 Import 한다.





그럼 붉은색 느낌표가 나타나면서 이슈가 발생하는데 이는 인증서 문제로 p.12 인증서 파일을 실행하여
인증서를 추가하면 해결 된다.

*총 세개의 인증서가 추가
 Apple Worldwide Developer....
 iPhone Developer:...
 iPhone Distribution:..

Xcode를 다시 실행하면 이슈가 해결된걸 확인 할 수 있습니다.




이제 빌드를 시작하면 또 다른 이슈 아닌 이슈가 발생합니다.




키체인을 사용하기 위해 관리자 이름과 암호를 입력해야 하는데
입력을 하고 허용을 눌러도 계속 뜨게 됩니다. (계속 입력하면 없어진다는 말도 있습니다)

일단 유틸리티에서 ->"키체인 접근" 을 열어 시스템 키체인을 확인합니다
iOS Developer....
iOs Distributi... 



라는 두개의 개인키가 추가 되어 있는것을 확인합니다.
*만약 없다면 빌드를 하여 두세번 정도 관리자 이름과 암호를 입력하고 키체인 접근 프로그램을 재실행
하면 추가 될 것입니다.

iOS Developer.... 개인 키를 열어 "접근제어" -> 모든 응용 프로그램이 이 항목.. 을 체크 -> 변경사항 저장 -> 관리자 이름과 암호 입력

"키체인 접근" 프로그램을 닫고 빌드를 하면 암호 입력창이 뜨지 않고 성공적으로 빌드가 됩니다.



iPhone has denied the launch request 이슈 해결

빌드중에 iPhone has denied the launch request ....  이런 이슈가 발생하는 경우

Commad  + shift + k 눌러 프로젝트 클린을 해보세요 !

2019년 6월 19일 수요일

Could not locate device support files. 이슈 해결



디바이스의 iOS 버전이 높아 X code 앱 빌드 시 발생하는 오류!
해결 방법은 간단하다.
X code 를 업데이트 합니다 (업데이트가 귀찮으시면 해당 디바이스의 버전의 빌드 파일을 따로 다운로드하여 X code에 추가 해주는 방법도 있습니다)

"codesign wants to access key "access" in your key chain." 이슈 해결


"codesign wants to access key "access" in
your key chain.



X-code 앱 빌드 시 "Codesign 이 "Access" 키체인 액세스 하기위해 암호를 입력하라는 창이 계속 뜬다면 맥북 사용자 암호 입력 항상허용을 눌러주세요




CocoaPods 설치 및 라이브러리 추가 (CocoaPods install & library add) @@ in Swift4.2.1 - Xcode 10.1

1. Xcode 에 CocoaPods 설치 

  터미널 실행 -> sudo gem install cocoapods 입력 
   *제거는 sudo gem uninstall cocoapods

2. CocoaPods Podfile 파일 생성

  1) 터미널 실행 해당 프로젝트 폴더로 경로 이동 -> pod init 입력
  2) 폴더 내 Podfile 파일 생성 확인 (Podfile 파일 내 라이브러리를 추가하여 설치를 진행하게됩니다.)
  3) 파일 여는 2가지 명령어 (프로젝트 경로에서 명령어 입력!)
     "open -e podfile" (텍스트 편집기)
     "open -a Xcode Podfile" (Xcode)

3. CocoaPods 라이브러리 추가

  1) Podfile 파일을 열어 위 명령어를 이용해 내용을 확인을 합니다
    
   
  
  2) 라이브러리를 추가하기위해 설치할 라이브러리를 찾습니다.
      설치를 위해 Podfile 파일에 내용을 추가하고 저장


   3) 터미널을 실행하여 해당 프로젝트 경로로 이동 후 pod install 을 입력하면 라이브러리 설치를
       합니다

4. 마무리

설치가 다 되었다면 프로젝트 폴더내에 프로젝트명.xcworkspace 파일을 열어 실행 후 코딩작업을 한다.








2018년 6월 3일 일요일

알고리즘 문제풀이에 도움이 되자! 문자열 편@@ in Swift4.0


let str = "test 1234"

// 문자열 자르기 -> 배열
let arr = str.split(separator: "1")
// "test", "234"]

// 특정 문자 포함 여부 -> Bool
let indexString = str.contains("1")
// true

// 문자열에서 마지막 문자 가져오기
// Character
let lastChar = str.last!
// subscriptingCharacter
let lastChar2 = str[str.index(before: str.endIndex)]


// index 를 이용한 특정순서의 문자 가져오기
print(str[str.index(str.startIndex, offsetBy: 0)]) // t
print(str[str.index(str.endIndex, offsetBy: -1)]) // 4


//루프를 이용해 각각의 문자에 접근
for char in str {
print(char) // H e l l o 각각 접근
}

// indices 를 이용해 각각의 문자에 접근
for index in str.indices {
print(str[index]) // H e l l o 각각 접근
}

// components 이용한 특정 문자 제거
let compStr = str.components(separatedBy: " ")
//["test", "1234"]

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)
    }




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


추천 게시물

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

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