제가 욕한거 아니에요

 

안녕하세요. 오늘 가져온 5번째 문제 제목은 WTF_CODE입니다.

 

시작 하기전에 WTF이란 What the fxxx의 약자인데요. 문제가 거친걸로 보아하니 본적이 없는 코드가 나오는 문제인거 같아요.

 

오늘도 풀이를 시작해 볼게요.

문제 본문

 

This is another programming language. : 이것은 다른 프로그래밍 언어입니다.

Can you read this source code? : 당신은 이 소스 코드를 읽을 수 있나요?

 

소스코드 정도야 프로그래밍 언어가 거기서 거기지 한번 풀어봅시다.

 

Start를 누르면 다음과 같은 화면이 나오는데요. 괜히 긴장되게 만드네요..

본문

source_code.ws를 클릭해서 다운로드 해봅시다. ws확장자를 가진 파일을 열수 있는 프로그램이 없어서 저는 TextWrangler로 오픈했습니다.

 

source_code.ws

사진 잘못올렸다고 생각하시겠지만 아니에요. 이게 맞아요.

뭘 읽으라는 건지 본문 처럼 아무것도 읽을 수가 없어요. 글씨가 흰색인가 하고 드래그 해봤는데 아무것도 보이지 않아요...

 

와 이거 망했다. 글이라도 있으면 추측이라도 할 수 있는데 아무것도 없으니 전 포기하겠습니다.

는 아니고 뭐야 하고 마우스로 몇번 긁어봤는데 뭔가 있긴 하더라구요.

 

source_code

아니 뭔가는 있는데 이게 뭔가 싶었어요. 공백 문자만 잔득 쳐논거같이 만든 코드를 전혀 읽을 수가 없었어요.

이럴 때 구글이 한몫을 하죠. 구글에 공백문자만 있는 코드 라고 한글로 검색하니까 나무위키가 나왔어요.

 

https://namu.wiki/w/%ED%99%94%EC%9D%B4%ED%8A%B8%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4

 

화이트스페이스 - 나무위키

2003년 만우절에 에드윈 브래디(Edwin Brady), 크리스 모리스(Chris Morris)라는 두 사람이 발표한 난해한 프로그래밍 언어. 얼핏 보면 코드로 보이지도 않는 의미불명, 정체불명의 프로그래밍 방식이 압권이다. 이름 그대로 화이트스페이스(Whitespace)인데, 모든 명령어가 스페이스, 탭, 엔터로 구성되어 있다. 공백과 개행문자를 1바이트로 치기 때문에 바이트 수는 늘어나지만 소스 코드를 열어보면 아무것도 안 쓰여있는 것처럼 보인다.

namu.wiki

어떤 건지는 자세히 나오지는 않고 화이트 스페이스 라고 하더군요. 다시 구글에 화이트 스페이스를 검색해봤습니다.

 

이번에 위키백과에 의하면 

화이트스페이스(Whitespace)는 에드윈 브래디(Edwin Brady)와 크리스 모리스(Chris Morris, cim)가 2003년 4월 1일(만우절)에 발표한 난해한 프로그래밍 언어이다. 문법에는 오로지 공백과 탭, 그리고 개행 문자만이 의미가 있으며, 인터프리터는 이 3종류의 공백 문자를 뺀 모든 문자를 무시한다. 2004년 현재 이 언어의 최신 버전은 0.3이다.

 

출처:

https://ko.wikipedia.org/wiki/%ED%99%94%EC%9D%B4%ED%8A%B8%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)

 

화이트스페이스 (프로그래밍 언어) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 화이트스페이스(Whitespace)는 에드윈 브래디(Edwin Brady)와 크리스 모리스(Chris Morris, cim)가 2003년 4월 1일(만우절)에 발표한 난해한 프로그래밍 언어이다. 문법에는 오로지 공백과 탭, 그리고 개행 문자만이 의미가 있으며, 인터프리터는 이 3종류의 공백 문자를 뺀 모든 문자를 무시한다. 2004년 현재 이 언어의 최신 버전은 0.3이다. 이 언어는 스택 기반의 명령형 프로그래밍 언어이

ko.wikipedia.org

이제 무슨 언어인지를 알수있으면 이코드를 이해할 수 있는 디코더를 찾아봐야겠네요.

 

제가 찾아본 화이트스페이스 디코더는 여기에요.

https://vii5ard.github.io/whitespace/

 

사용법은 우리가 다운 받은 소스를 전부 드레그 해서 붙여넣으면

화이트 스페이스 디코더

위와 같이 붙여놓으면 탭이랑 스페이스바를 색으로 구분해논 코드를 볼 수 있어요.

음 저렇게 해도 읽을 수 없으니까 위에 Run을 누르면 아래 Output 쪽에 키가 나옴니다.

bd3d71cf803c82f2c982c84f47d466656cdf886f

또 다른 사이트로는 

https://ideone.com/

라는 사이트가 있어요. 화이트 스페이스 코드 뿐만아니라 여러 언어를 컴파일 해볼 수 있는 사이트로 프로그래밍 공부할 때 좋을거 같은 사이트라서 추천해 드려요

ideone 지원하는 언어

위와 같은 언어들을 지원하고 맨~~ 뒤에 화이트스페이스가 있으니 여기 사이트도 한번 이용해 보세요 ㅎㅎ

 

 

오늘도 문제 하나를 구글의 도움을 받아서 풀어봤어요.

 

하나씩 풀어 나갈때마다 하나를 배우고 새로운 것을 배우는 기분은 어떤가요?

 

당황스러운 문제였지만 내가 모르는 지식이 있으면 검색을 하면되고 배우면 될거같아요~

다들 포기하지 말고 열심히 공부해 봅시다.

 

ps.화이트스페이스 코드라는 걸 모르면 악용당했을 때 쉽게 찾지 못할거 같은 느낌이 드네요. 웹소스 중간에 화이트 스페이스 코드를 삽입해 공격하는 방법도 있을거 같아요.

'보안 > wargame.kr' 카테고리의 다른 글

[wargame.kr] login filtering  (0) 2020.02.19
[wargame.kr] QR CODE PUZZLE  (0) 2020.02.17
[wargame.kr] flee button  (0) 2020.02.15
[wargame.kr] already got 시작  (0) 2020.02.15

Wargame 네 번째 문제 풀이 - Login filtering

안녕하세요. 오늘 풀어볼 문제는 login filtering입니다.

 

어느세 하나씩 올리다 보니까 네 번째 풀이가 됐네요.
모든 문제를 풀고 다른 사이트 문제를 정복하는 그날까지!!

 

이제 시작해 보겠습니다. ㅎㅎ

 

 

문제 지문

 

I have accounts. but, it's blocked. : 나는 계정을 가지고 있습니다. 하지만 차단당했어요.

can you login bypass filtering? : 당신은 필터링을 우회 할 수 있나요?

 

위처럼 해석이 되는데 문제를 보고 얻을 수 있는 힌트를 살펴 볼까요?

 

1. 계정을 가지고 있다.

2. 편법(우회)을 이용해 로그인을 한다.

 

이 두가지 정도를 생각해 보고 문제를 start 해보겠습니다.

 

 

시작을 하게되면 ID, PW 입력 폼, get source로 구성이 되어있는 페이지가 나옵니다.

일단 아래 보이는 get source를 무시하고 admin 1234, 1234 1234 부터 쳐보니 왼쪽 상단 처럼 'wrong..' 이라고 아련하게 써있네요.

get source를 한번 클릭해 볼까요?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?php
 
if (isset($_GET['view-source'])) {
    show_source(__FILE__);
    exit();
}
 
/*
create table user(
 idx int auto_increment primary key,
 id char(32),
 ps char(32)
);
*/
 
 if(isset($_POST['id']) && isset($_POST['ps'])){
  include("../lib.php"); # include for auth_code function.
 
  mysql_connect("localhost","login_filtering","login_filtering_pz");
  mysql_select_db ("login_filtering");
  mysql_query("set names utf8");
 
  $key = auth_code("login filtering");
 
  $id = mysql_real_escape_string(trim($_POST['id']));
  $ps = mysql_real_escape_string(trim($_POST['ps']));
 
  $row=mysql_fetch_array(mysql_query("select * from user where id='$id' and ps=md5('$ps')"));
 
  if(isset($row['id'])){
   if($id=='guest' || $id=='blueh4g'){
    echo "your account is blocked";
   }else{
    echo "login ok"."<br />";
    echo "Password : ".$key;
   }
  }else{
   echo "wrong..";
  }
 }
?>
<!DOCTYPE html>
<style>
 * {margin:0; padding:0;}
 body {background-color:#ddd;}
 #mdiv {width:200px; text-align:center; margin:50px auto;}
 input[type=text],input[type=[password] {width:100px;}
 td {text-align:center;}
</style>
<body>
<form method="post" action="./">
<div id="mdiv">
<table>
<tr><td>ID</td><td><input type="text" name="id" /></td></tr>
<tr><td>PW</td><td><input type="password" name="ps" /></td></tr>
<tr><td colspan="2"><input type="submit" value="login" /></td></tr>
</table>
 <div><a href='?view-source'>get source</a></div>
</form>
</div>
</body>
<!--
 
you have blocked accounts.
 
guest / guest
blueh4g / blueh4g1234ps
 
-->
cs

저는 66번째 줄이 눈에 띄더라구요. 차단 당한 ID / PW중에 짧아서 그런지 먼저 쳐보게 됬어요.

 

 

guest / guest

 

음 역시나 로그인은 되지않아요. 그럼 다시 소스를 확인해 보겠습니다.

 

31~39 행을 보면 단순 입력받은 아이디와 직접 코드로 넣어둔 문자열이 같으면 차단 한다는 것을 확인할 수 있어요.

또한 그위에 행들의 대부분이 mysql_ 어쩌구로 시작하는 것으로 보아하니 DBMS는 MySQL이라는 것을 추측할 수 있겠네요.

뿐만 아니라 시작 행에 <?php>를 통해 php코드 라는 것을 알 수 있습니다. (php는 MySQL을 사용합니다.)

 
여기서 위에 정보를 가지고 '어떻게 플래그를 얻을 수 있을까?' 라는 고민을 하면서 감조차 오지 않는 분들이 많을거라 생각해요.

그럼, MySQL의 특징중 하나를 알려드릴게요.

 

MySQL은 기본적으로 대소문자를 구분하지 않습니다.

그렇다면 28행에 select문에 guest가 들어가든지 GUEST가 들어가든지 똑같은 결과 값이 나오겠죠?

 

즉,

select * from user where id='guest' and ps=md5('guest') 

select * from user where id='GUEST' and ps=md5('guest')이 두개는 같은 쿼리 문이라고 할 수 있습니다.

 

if($id=='guest' || $id=='blueh4g') 우리는 이 조건문만 피해가면 되기때문에 'guest'가 아닌 어떤 Guest를 넣어도 상관이 없습니다. ㅎㅎ

 

한번 입력해볼까요?

 

저는 Guest / guest를 입력했습니다.

 

727fc2ac512370bfcd12b5a7c5a6ad116c06da45

 

이렇게 MySQL의 특징의 취약점을 이용한 로그인 우회를 해서 문제를 풀 수 있었습니다.

 

추가적으로 '로그인 기능 / 회원가입 기능을 구현할 때 어떤 식으로 안전하게 코딩을 해야하는가.'에 대한 답변을 하자면

 

where 절에 binary를 추가하는 방법이 있습니다.

guest와 Guest의 2진코드는 엄연히 다른 값이 나오기 때문에 좀더 안전한 페이지를 만들 수 있습니다.

 

예를 들어 위의 select문을 다음과 같이 만드는 것이 가능합니다.

select * from user where binary id='$id' and ps=md5('$pw') 

 

이렇게 해서 네 번째 문제 까지 풀이가 끝났습니다. 생각보다 쉽지 않나요?

 

다음은 WTF_CODE 라는 문제와 함게 찾아오겠습니다~
이번에도 열심히 따라와 주셔서 감사합니다ㅎㅎ

'보안 > wargame.kr' 카테고리의 다른 글

[wargame.kr] WTF_CODE  (0) 2020.02.25
[wargame.kr] QR CODE PUZZLE  (0) 2020.02.17
[wargame.kr] flee button  (0) 2020.02.15
[wargame.kr] already got 시작  (0) 2020.02.15

Wargame 세 번째 풀이 QR code puzzle

안녕하세요. 오늘 풀어볼 문제는 QR code puzzle입니다. 같이 지문을 확인해 볼까요?

문제 지문

javascript puzzle challenge, just enjoy! : 자바 스크립트 퍼즐이다! 그냥 즐겨!

지문에는 힌트가 없어 보이니 바로 시작해보겠습니다.

 

시작하자마자 정말 끔찍한 퍼즐이 하나 나왔어요.

문제 본문

사실 이 문제를 보자마자 '풀면 다음 화면으로 넘어가나?' 라는 생각을 먼저 했고 문제를 풀기 위해 몇가지 생각을 했어요.

1. 자바스크립트로 사진을 쪼갠것이니까 원본 파일이 있을 것이다.

2. 그 원본을 보면 퍼즐을 풀 수 있다.

3. 퍼즐을 풀면 키가 나올 것이다!

 

저는 위에 세가지 가설을 세웠고 일단 원본 파일을 찾기 시작했죠.

 

오늘 사용할 기능은 크롬 개발자 모드에 있는 sources 패널 입니다.

개발자 모드의 sources 패널

Sources 패널은 위와 같이 구성이 되어있고,

파일을 열어보거나 수정 할 수 있으며 자바스크립트를 디버깅 할 수 있는 등 여러가지 소스와 관련된 기능을 진행 할 수 있습니다.

 

위 사진에 눈에 띄는 폴더가 있지 않나요?

 

네 바로 img폴더입니다.  저 폴더를 신나게 클릭해서 들어가보니

qr code

생각보다 쉽게 찾아서 아싸 신난다 이제 이거보고 풀어야지~~~~

 

했는데 그림도 눈아프고 순서는 또 어떻게 찾지 하면서 30분정도 풀었어요.

근데 갑자기 지나가던 친구가 옆에서 큐알 코드 보더니 찰칵.

답이 걍나오네ㅋ

 

그러게요 안풀어도 되더라구요.

 

왜 qr코드를 줬는지 사진 찍어볼 생각도 안하고 풀고 있던 제가 삽질한거죠.

여러분들은 삽질하지 말고 이런거 나오면 한번 찍어보세요 ㅎㅎ...

 

그리고 웹으로도 큐알 코드를 인식 시킬 수 있는 방법이 몇가지가 있어요. 사실 패스 키가 길고 해서 찾아본 방법인데

 

https://zxing.org/w/decode.jspx

 

ZXing Decoder Online

 

zxing.org

이런 사이트에 들어가서 qr코드의 사진 또는 qr이 있는 주소 링크를 붙여 주시면 되는데요.

 

사진을 번거롭게 또 저장 할 바에 차라리 타자로 빨리 치겠다 라고 생각하실 수 있겠지만 우리는 이미 qr코드의 주소를 알고 있어요.

(타자치는 사람 오타나라)

open in new tab

위에 움짝에서 보면 링크가 뜨는것을 확인 할 수 있는데 이를 새탭에서 열고 그 주소를 위에서 알려준 사이트에 들어가서 입력하고 제출하면 됩니다.

제출 버튼을 누르게 되면 qr코드를 디코딩 한 결과물이 나오겠죠?

qr코드 -> decode

또 한번 여기서 플래그 주소를 찾을 수 있겠네요. 저 주소를 들어가 보겠습니다.

 

8d696d0d987622edcfb1c3638caad7acb629e188

이렇게 아주 쉽게!(나는 삽질했지만) 문제를 해결할 수 있습니다.

 

아직 초반의 문제들이라서 어려운 부분도 없고 잘 따라하면서 감을 익힐 수 있을것 같아요.

저도 처음에 개발자 모드를 이렇게 까지 활용해 볼줄 몰랐는데 문제를 풀면 풀수록 친해지게 되더라구요.

 

오늘은 이만 세 번째 풀이를 마쳐보겠습니다. 감사합니다 ㅎㅎ

'보안 > wargame.kr' 카테고리의 다른 글

[wargame.kr] WTF_CODE  (0) 2020.02.25
[wargame.kr] login filtering  (0) 2020.02.19
[wargame.kr] flee button  (0) 2020.02.15
[wargame.kr] already got 시작  (0) 2020.02.15

Wargame.kr 두 번째 풀이 - flee button (도망 버튼)

두 번째 풀이가 될 flee button 입니다. 문제 제목에서 알 수 있듯이 버튼이 도망가는 것을 잡아야 할것 같아요.

문제 지문

문제를 클릭하게 되면 다음과 같이 볼 수 있어요.

Click the button! i can't catch it! : 버튼을 눌러라! 나는 잡을 수 없다!

라고 하면서 문제를 풀면 85포인트를 주다고 하네요.

 

그럼 이번 문제의 핵심은 버튼 클릭이 되겠어요.

 

그렇다면 한번 잡아보도록 하겠습니다. 

 

시작화면

click button, if you want to get the authentication key : 인증키를 얻으려면 버튼을 눌러라

라고 하면서 버튼이 있습니다. 저 버튼을 누르려고 마우스를 움직이는데 버튼이 자꾸 도망다니네요.

 

가만히 있으라고

 

위와 같이 버튼이 도망다니는데 어떻게 하면 좋을까요..

 

소스에 해답이 있지 않을까 해서 저는 개발자 모드로 들어가 봤습니다.

마우스 이동시 변하는 부분

마우스를 움직일 때마다 style의 좌표값이 계속 변하는 것을 확인 할 수 있었어요.

 

그래서 저부분을 지워버리면 버튼이 안움직이지 않을까라는 생각으로 style을 지워봤더니

버튼고정

저위 쪽으로 버튼이 움직이지도 않고 얌전하게 고정되더라고요.

 

저렇게 해서 버튼을 클릭할 수 있게되어 클릭했습니다.

 

버튼을 클릭하자 잘했다는 칭찬과 함께 플래그를 얻어서 문제를 풀었어요.

05f660fab34de85f5014b073c265e42776c1ac79

 

이와같이 소스를 수정해서 문제를 푸는 방법이 있고, 제가 푸는 방법외에도 다른 방법이 있을 수 있으니 어디까지나 참고용으로 봐주시면 감사하겠습니다.

'보안 > wargame.kr' 카테고리의 다른 글

[wargame.kr] WTF_CODE  (0) 2020.02.25
[wargame.kr] login filtering  (0) 2020.02.19
[wargame.kr] QR CODE PUZZLE  (0) 2020.02.17
[wargame.kr] already got 시작  (0) 2020.02.15

1. 워게임의 시작 

보안공부를 어디서 부터 어떻게 시작해야 할지 고민하다 정보보안 산업기사 준비와 함께 워게임 사이트에 있는 문제를 포스팅 해보기로 했어요.

 

많은 사이트가 있지만 우선 아래있는 사이트로 시작하게 되었습니다.

http://wargame.kr

 

Wargame.kr - 2.1

https://www.facebook.com/wargame.kr

wargame.kr

 

먼저 사이트에 들어가면 다음과 같이 메인 화면이 구성되어 있고 로그인을 하고 정답을 입력해 점수를 획득하는 방식이며 flag를 찾는 형식으로 되어있어요.

Capture The Flag(CTF) 라고한다.

wargame.kr 메인 화면

 

좌측에서 로그인과 회원가입을 할 수있으며 사용자가 문제의 정답을 입력할 때 로그인을 필수로 하기 때문에 사진과 같은 양식으로 회원가입 후 시작할 수 있습니다.

회원가입 폼

 

회원 가입후 로그인을 하게 되면 문제들을 풀어 정답을 입력할 수 있게됩니다.

Wargame - Chaalenge

이제 Wargame의 Challenge 메뉴를 들어가 가장 낮은 포인트의 문제 부터 시작해 보겠습니다. (낮은 포인트가 쉬운 문제일 듯)

 

2. already got (이미 얻은)

워게임 특징중 하나는 제목과 지문을 통해 어느정도 힌트를 얻고 시작한다고 생각이 돼요. 문제의 지문을 보겠습니다.

already got 문제의 지문

Can you see HTTP Response header? : 당신은 HTTP reponse header를 볼 수 있습니까?

라는 질문과 함께 문제가 시작되네요. 우측 하단에 Start 버튼을 누르면 문제가 시작이 됩니다.

 

시작 화면

you've already got key : 당신은 이미 키를 가지고 있습니다.

시작부터 키를 가지고 있다고 하네요. 아까 지문 Can you see HTTP Response header?를 보아하니 HTTP response header를 열어보면 키가 있다는 것을 유추할 수 있습니다.

 

여기서 HTTP reponse header 를 보는 법은 크롬에서 개발자 모드로 진입을 해야합니다.

windows : F12 , mac : option(⌥) + command(⌘) + i

 

개발자 모드로 진입후 Network 탭을 클릭하면 아래와 같은 화면이 보이는데 아무것도 보이지 않아 새로고침을 해봤습니다.

 

새로 고침후 다음과 같은 화면을 볼 수 있고 already_got을 클릭해 보겠습니다.

 

클릭하게 되면 Headers가 보이게 되는데 그중에서도 문제의 핵심인 Response Headers를 보겠습니다.

already_got header

Response Headers 아래 보면 FLAG라고 있는데 저 값이 정답임을 유추 할 수 있습니다.

FLAG : 380f7cc76a438ce9654bbebbfd8fb998c003a7ab 의 값을 입력해 보겠습니다.

 

저는 이미 정답을 입력했었기 때문에 Already solved! 가 뜨지만 처음 하시는 분들은 화면이 닫히면서 문제가 초록색으로 바뀌고 좌측 프로필에 점수가 쌓이는 것을 볼 수 있습니다.

 

 

이번에 풀어본 문제는 HTTP통신간 리스폰스 헤더에 어떠한 정보들이 담겨서 이동하는지 확인 할 수 있었으며 네트워크에 대해서 알면 좀더 이해가 쉬울거라고 생각이 됩니다.

 

위를 바탕으로 HTTP통신간에 헤더에 많은 정보들이 담겨져 이동하는 것을 볼 수 있으며 따로 공부해 보는것도 좋을거 같아요.

 

이상으로 워게임 시작과 첫번째 문제 Already got의 문제 풀이 였습니다. 

 

참고 지식:

Response headers : 위치 또는 서버 자체에 대한 정보(이름, 버전 등)와 같이 응답에 대한 부가적인 정보를 갖는 헤더.

HTTP Header에 대한 추가적인 설명은 다음 링크를 참조해 주세요~

https://developer.mozilla.org/ko/docs/Web/HTTP/Headers

 

HTTP 헤더

HTTP 헤더는 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송할 수 있도록 해줍니다. HTTP 헤더는 대소문자를 구분하지 않는 이름과 콜론 ':' 다음에 오는 값(줄 바꿈 없이)으로 이루어져있습니다. 값 앞에 붙은 빈 문자열은 무시됩니다.

developer.mozilla.org

 

 

ps : 필자도 공부중인 학생이라 정확하지 않은 지식과 영어 해석에 오류가 있을 수 있습니다. 틀린 지식과 질문은 댓글을 남겨주세요

'보안 > wargame.kr' 카테고리의 다른 글

[wargame.kr] WTF_CODE  (0) 2020.02.25
[wargame.kr] login filtering  (0) 2020.02.19
[wargame.kr] QR CODE PUZZLE  (0) 2020.02.17
[wargame.kr] flee button  (0) 2020.02.15

테이블 레포트 입니다.

201612051.zip
0.05MB

후행 클로저 : Trailing closure라고 하며  파라매터중  마지막 파라매터가 클로저일 경우 파라매터 레이블을 사용하지 않고 바로 클로저로 사용하는 것을 후행 클로저 라고 한다.

 

다음은 UIAleartAction 클래스의 인스턴스를 생성하는 과정이다.

 

UIAleartAction의 Initailizer를 보면 아래와 같은데 주목할 부분은 마지막 파라매터인 handler이다.

handler의 타입은 반환형이 Void인 옵셔널 함수이다.

 

@여기서 함수형이 옵셔널인 이유는 아무 동작도 하지 않는 UIAleartAction형 인스턴스 변수를 생성할 수 있기 때문이다.

 

이제 인스턴스를 생성해 보자

1
2
3
4
let offAction = UIAlertAction(title: "아니오, 끕니다(off)", style: UIAlertAction.Style.default,
                                      handler: {
                                        ACTION in self.lampImg.image = self.lampOff
                                        self.isOn = false})

offAction이라는 변수를 생성했고 파라매터 값으로 각각의 문자열, 스타일을 넣어주는 모습을 확인 할 수 있다.

 

마지막 파라매터는 클로저 함수(익명함수)로 함수인데 이름이 없는 함수라고 할 수 있다.

 

함수의 이름을 붙이는 이유는 다시 사용하기 위해서 이름을 붙여주고 정의를 한뒤 호출해서 사용한다. 하지만 스위프트는 재사용 필요가 없는 한번만 쓰면 되는 함수를 코드안에 바로 짜넣을 수 있는데 그것이 바로 클로저 함수라고 한다.

 

위와 같은게 클로저 함수 이고 위 코드를 후행 클로저로 짯을때를 비교해보자

1
2
3
4
let offAction = UIAlertAction(title: "아니오, 끕니다(off)", style: UIAlertAction.Style.default)
{
                                        ACTION in self.lampImg.image = self.lampOff
                                        self.isOn = false}

위와 다른 점은 마지막 파라매터의 내부 매개변수명(파라매터의 레이블)이 없어지고 바로 괄호를 닫고 클로저를 삽입했다는 점이다.

 

그래서 클로저 함수는 마지막파라매터가 클로저 함수일때 파라매터의 레이블을 생략해버리고 괄호를 닫은뒤 클로저 함수를 삽입해도 에러 없이 실행이 가능하다.

'IOS > 레포트' 카테고리의 다른 글

1203 - Table  (0) 2019.12.03
Failable Initializers / 1.jpg (문자열 자르기)  (0) 2019.11.05
Swift와 Object-C 차이  (0) 2019.10.15

Failable Initializers란

클래스, 구조체, 열거형을 만들때 실패할 가능성이 있으면 Initailizer뒤에 옵셔널을 줘서 인스턴스 생성실패를 막아줄 수 있다.

 

예로는 다음과 같다

 

UIImage 클래스를 인스턴스로 선언할때 볼 수 있다

위는 이름 초기화 중 해당이름이 없을때 초기화 실패 가능성이 있기때문에 Failable Initializers를 사용하고 있다.

 

 

문자열 자르기



위는 픽커뷰 사용중 row하나가 선택되었을 때 실행되는 함수로

 
lblImageFileName.text = String(imageFileName[row].split(separator: ".").first!)
cs

하나씩 해석해보면 다음과 같다.

lblImageFileName : 아웃렛 변수

lblImageFileName.text : 아웃렛 변수의 텍스트

 

imageFileName : String형 배열

row : pickerView로 선택된 행 번호

split(separator: ".") : 점( . )을 기준으로 문자열을 자르겠다는 함수

.first : 자른 문자열중 첫번째에 인자에 해당하는 값

 

결론은 lblImageFileName.text에 imageFileName의 이름을 .을 기준으로 잘라서 점 앞쪽에 있는 문자열을 대입하는 과정이다 

 

하지만 문자열 자르는 부븐을 String으로 형변환을 해주었다.

 

왜냐하면  imageFileName[row].split(separator: ".").first! 이부분의 자료형은 String.SubSequence 이기 때문에

String? 형인 imageFileName.text에 대입이 될수 없기 때문이다

'IOS > 레포트' 카테고리의 다른 글

1203 - Table  (0) 2019.12.03
클로저(closure)/후행클로저(trailing closure)  (0) 2019.11.11
Swift와 Object-C 차이  (0) 2019.10.15

+ Recent posts