구조체  & 클래스


선언


struct 구조체이름 {

정의

}


class 클래스이름 {

정의

}


인스턴스생성


var 변수 = 클래스이름();


프로퍼티접근


인스턴스명.프로퍼티이름;


인스턴스비교

 ' === '


지연 저장 프로퍼티


프로퍼티 정의 앞에 lazy키워드를 붙여 사용한다. 이 키워드가 붙은 프로퍼티는 호출되기전까지는 초기화 되지않는다 클래스 인스턴서가 생성되어 모든 프로퍼티가 만들어지더라도 lazy 키워드가 붙은 프로퍼티는 선언만 될 뿐 초기화 되지않고 프로퍼티가 호출되는 순간 초기화된다.


프로퍼티 옵저버


프로퍼티의 값이 변경될 때 이를 알아차리고 반응하는 객체


willSet 값이 저장되기 직전에 호출되는 옵저버

didSet 값이 저장된 직후에 호출되는 옵저버


var income : Int = 0 {

willSet(newIncome) {

print()

}


didset {

}

}


타입 메소드


인스턴스를 생성하지 않고 호출 할 수 있는 메서드


class func 함수명


Any, AnyObject


objective-c의 NSObject와 같은 역할을 하는 클래스, 클래스타입에 상관없이 모든 종류의 클래스 타입을 저장할 수 있는 범용타입의 클래스 id타입과 같은 형태인듯.

클래스일 때만 정의 가능하다. 구조체는 불가. Any객체는 스위프트에서 제공하는 모든 타입에 대한 범용성을 지원한다.


옵셔널 체인(Optional Chain)


옵셔널 타입으로 정의된 값이 하위 프로퍼티나 메소드를 가지고 있을 때, 이 요소들을 if 구문을 쓰지 않고도 간결하게 사용할 수 있음.


if let name = startup?.ceo?.name{

내용

}


- 옵셔널 체인으로 참조된 값은 옵셔널 타입으로 반환

- 옵셔널 체인과정에서 옵셔널 타입들이 여러 번 겹쳐 있더라도 중첩되지 않고 한번만 처리.






* objective-c 의 #pragma mark는 // mark: -markname으로 사용!


'swift 공부' 카테고리의 다른 글

TableView에 대한 고찰  (0) 2017.12.14
[swift] NavigationController Push View Animation 효과주기  (0) 2017.08.22
[arcjeen] 5. swift closure  (0) 2017.03.21
[arcjeen] 4. swift 함수  (0) 2017.03.21
[arcjeen] 3.swift Optional  (0) 2017.03.21

WRITTEN BY
arcjeen
ios 관련문의 slimforce@naver.com

,


클로저(Closure)


일회용 함수를 작성할 수 있는 구문. 일회용 함수란 한번만 사용할 구문들의 집합이면서 그 형식은 함수로 작성되어야하는 제약 조건이 있을 때 만들어 사용 할 수 있는 함수이다.

일회용 함수는 굳이 함수의 이름을 작성할 필요없이 생략된다는 점에서 익명 함수라고 부르기도 한다.


objective -c의 블록과 같은 개념.

또는 자바 파이썬의 람다함수.


표현식


func 키워드를 생략하며 함수의 이름 또한 생략한다.


{ (매개변수) -> 반환타입 in

구문

}


{ ( ) -> () in

print("i am closure");

}


{ () -> Void in

print("i am closure")

}


//상수나 변수에 클로저표현식을 할당 후 실행

let f = { () -> Void in

print("i am closure");

   }

f();


//상수나 변수에 할당 하지 않고 실행


({ (s1:Int s2:String) -> void in

print("\(s1), \(s2)")

})(1,"closure")



일반 함수를 closure로 변경하는 예제


let value = [1, 9, 5, 7, 3, 2];


//내림차순 정렬        

        func order(s1:Int, s2:Int) -> Bool {

            

            if s1 > s2{

                return true;

            }else{

                return false;

            }

            

        }

        

        value.sorted(by:(order));




//closure 식으로 변환


value.sort( { (s1:Int, s2:Int) -> Bool in

if s1> s2{

return true;

}else{

return false;

}

});


//closure식을 한줄로 변환


sorted(by: { (s1:Int, s2:Int) -> Bool in return s1 > s2 });


//비교구문은 자동으로 return형을 Bool형으로 간주하기때문에 bool 생략


sorted(by:(s1:Int, s2:Int) in return s1 > s2 });

//매개변수 타입 어노테이션 생략

value.sorted(by:{s1, s2 in return s1 > s2 });

//매개변수 생략 
//매개변수가 생략되면 매개변수명 대신 $0, $1, 와같은 이름으로 할당된 내부 상수를 이용할 수 있다. 매개변수가 생략되면 실행구문만 남기때문에 in 키워드로 클로저 선언과 실행을 구분할 필요가 없기때문에 in 키워드 또한 생략 가능하다.

value.sorted(by:{$0>$1});

//연산자 생략

value.sorted(by: > );


* 일회성 함수의 간결성을 강화하여 코드의 숫자를 줄일 수 있다는 점에서는 강력하다고 느껴지지만 유지보수의 측면에서 봤을때 무분별한사용은 하지않는게 좋을것같다....




        


WRITTEN BY
arcjeen
ios 관련문의 slimforce@naver.com

,


Function


함수 정의


- Objective-c


(반환형) 함수이름 : (인자타입) 인자값  외부매개변수:(인자타입)인자값 {

내용

}


        - (id)init :(NSMutableDictionary *)passDict list:(NSDictionary *)listArr{

    

                        if (self = [super init]) {

        

                        }

                        return self;

}




- Swift


첫글자는 반드시 영어 또는 _ 로 시작해야한다.


object-c는 외부매개변수와 내부매개변수를 ' : '으로 구분하지만 Swift는 외부매개변수와 내부매개변수를 나란히 작성한후 type을 ' : ' 으로 구분한다


func 함수명 (인자값1:타입, 인자값2:타입) -> 반환타입{

실행내용

return 반환값

}


func 함수명(매개변수1:타입, 외부 매개변수명 내부매개변수명: 타입 ){


}


func printHello(name:String) -> String{

let returnValue = "\(name)은 내이름";

return returnValue;

}


func printHelloWithName(name : String, msg welcomMessage : String){

print(\(name)님  \(welcomMessage));

}


//호출

printHelloWithName("arcjeen",msg:"하이");




 함수 호출


     Objective - c


[self 함수명];

인스턴스명.함수명;

[인스턴스명 함수명];


Swift


함수명();

printHello(inputName);





가변인자값


가변적인 개수의 인자값을 입력받아야 할때 사용.


Objective-c


//헤더선언

- (void)argTest:(NSString *)str, ... NS_REQUIRES_NIL_TERMINATION;

//구현

- (void)argTest:(NSString *)str, ... {

    va_list args;

    va_start(args, str);

    //va_start에서 포인트를 지정한 곳이 시작점이된다. 메모리상의 시작점 args->str

    for (NSString *arg = str; arg != nil; arg = va_arg(args, NSString *)) {

        //va_arg 통해 차례대로  인자의 포인터를 가져옴.

        NSLog(@"Argument = %@", arg);

    }

    va_end(args);//끝났을때 호출.

} 


Swift

func argTest(str:String...){

for r in str {    //배열로 입력된 값 순회탐색하면서 처리

내용

}

}



* Swift 에서 위의 예시에 사용된 매개변수는 상수로써 기능을 하게된다 즉 값의 변경이 불가능 하다 하지만 변수앞에 var 연산자를 추가한다면 상수가아니라 변수로써 선언이되어 함수내에서 값을 수정할 수 있다. 



Inout


Inout 키워드를 이용하면 함수내부에 전달된 변수의 값을 함수내부에서 수정하여 함수 외부의 변수에 영향을 줄 수 있다.


Swift


var count = 30;


func foo(inout paramCount : Int) -> Int{

return ++ paramcount;

}


//호출


print(foo(&count))


//매개변수에 count의 주소값을 전달하여 함수에서 전달받은 주소를 통해 외부인자값에 직접 접근하고 값을 변경한다.






























WRITTEN BY
arcjeen
ios 관련문의 slimforce@naver.com

,

ios rotate list

IPhone UI...UX 2017. 3. 21. 15:06



이번 프로젝트에서 개고생했던 UI들중 하나..

클라이언트가 회전하는 cd를 만들고싶다며 요구한 사항..


기본은 cd Image의 크기를고정시키고 cd 영역을 8 개로나눈뒤 uilabel을 할당하고  label이 중앙에 위치하였을때 의 위치를 고려하여 CGaffineTransform 함수로 각라벨들을 미리 회전시켜놓는다.


cdimageview 위에 pangestureRecognizer를 얹어주고 해당 offset에따른 각도를 계산해 cd를 돌려주는데 애메한 위치에 멈출경우 자동으로 가장가까운 라벨에 중심을 맞추게된다.


이미지가돌아갈때마다 uilabel의 위치를 계산하여 중심에오는 라벨의 크기를 변경하는데 imageView가 transform되지만 그안의 label들 좌표는 고정이 되어있는형태라 이부분을 해결하는데도 진땀을좀 뺏다


list의 갯수가 8개를 넘어가게되면 한바퀴가돌때마다 자동으로 이후의 list로 바뀐다. list에담을 수있는 갯수는 제한이없는데 예외들을 처리하는데 꽤 힘들었다.


클라이언트가 만들어달래서만들어주긴했는데 편의성에서보자면 전혀 쓰잘때기없는 Ui구현이었다.






WRITTEN BY
arcjeen
ios 관련문의 slimforce@naver.com

,


Optional


  값을 반환하는 과정에서 오류가 발생할 가능성이 있는 값을 옵셔널 타입이라는 객체로 감싼 후 반환하는 개념 (Optional Wrapping)

 

-> 런타임시에 프로그램이 비정상적으로 종료되는 것을 방지하기 위한 장치로 생각하면됨.


Objective-c 에는 일반언어의 null에 해당되는 nil 형이 있는데 이것은 객체들에는 할당할 수 있지만 일반 자료형에는 할당 할 수가 없다. 그렇기때문에 일반자료형을 대신해 반환형으로 Optional을 쓰는 것.


초기화


var optStr : String ?


자료형 뒤에 ?만 붙여주면된다.  옵셔널 타입으로 선언된 자료형은 선언만해도 nil로 초기화가 된다.


Forced Unwrapping (Optional 강제 해제)


Optional 타입의 자료는 어떠한 연산이나 결합도 지원하지 않는다. 그렇기때문에 자료를 감싸고있는 Optional 개체를 해제해주어야 되는데 이것을 옵셔널 해제라고 한다. 옵셔널 해제 방식에는 비강제 해제강제해제가 있다.


강제해제는 자료형뒤에 !(Forced-Unwrapping operator) 연산자만 붙여주면 객체가 해제되고 내부에 저장된 값을 추출할 수 있다.


var optInt : int? = 3;


print ((optInt));

print((optInt!));


결과

// Optional(3)

// 3



그러나 nil값이 할당되어 있는 옵셔널 변수에 강제 해제 연산자를 붙인다면 오류가 발생한다. 그렇기 때문에 강제해제를 할때는 항상 nil인지 아닌지 확인을 해주어야한다


if optInt != nil{

print((optInt)!)

}else {

print("this is nil")

}





Optional 비강제 해제



if 구문 내에서 조건식 대신 옵셔널 타입의 값을 일반 타입의 변수나 상수에 할당하는 구문을 사용하는 방식.


var str = "Swift";


if let intFromStr = Int(Str){

print("성공 반환값은 \(intFromStr)");

}else{

print("변환 실패");

}


Dictionary의 경우 무작위로 키가 사용될 수 있기 때문에 키가 있는지 점검하기가 어렵다. 그렇기때문에 키에 해당되는 벨류는 Optional객체로 반환된다.


Optional 자동 해제



명시적으로 강제 해제를 하지 않아도 컴파일러에서 자동으로 옵셔널을 해제하여 처리하는 경우가 있다.


비교연산을 처리할때는 옵셔널 타입여부에 구애받지않고 일반 자료형처럼 값을 비교하면 된다.




WRITTEN BY
arcjeen
ios 관련문의 slimforce@naver.com

,

- 튜플


집단 자료형으로써 한가지타입의 아이템만 저장할 수 있는 배열이나 딕셔너리와는 다르게 하나의 튜플에 여러가지 타입의 아이템을 저장할 수 있다. 선언된 튜플은 상수적 성격을 띄게되며 값의 추가 삭제등 일체의 변경이 불가하다. 상수로선언된 구조체와 비슷하다고 보아도 될 것 같다.


-Swift

var tpl01 :(Int, Int) = (100, 200);

let (a,b) = tpl01;                  // a,b라는 상수에 튜플 변수 할당



* 튜플은 순회특성도 지원하지 않는다. 데이터를 읽어오거나 크기를 계산할 수 있는 속성또한 없다.

  튜플이 가장 쓸만 한 곳은 함수의 반환형이 아닐까 생각한다.


- Dictionary


- Objective-c

NSDictionary *dict = 

[[NSDictionary alloc]initWithObjectsAndKeys:@"value",@"key",nil];

//초기화방법 1

NSDictionary *dict2 = @{

@"key":@"Value"

}; //초기화방법 2

NSString *valueStr = [dict valueforKey:@"key"];


  - Swift

var Capital = ["KR":"Seoul", "EN":"London"];  //초기화1

var capital : Dictionary <String, String>;       // 선언


capital["jp"] = "tokyo";                                 //키:벨류 삽입

capital.updateValue("busan","KR");             


// 키:벨류 삽입 및 수정. 이미 해당키에 대한 벨류가 있다면 벨류를 반환 없다면 nil반환


capital.["jp"] = "nil";

captal.removeValueForKey("jp");


//해당 키에대한 벨류 삭제. 벨류값 반환


var valueStr =  capital["KR"];




WRITTEN BY
arcjeen
ios 관련문의 slimforce@naver.com

,

1.변수선언

 

    - NSFoundation에 선언되어있는 클래스들을 사용하는 objective-c 와 달리 변수선언은  var, 상수선언은 let 을 통해서 하며 이후 자료형의 표시는 :String, :Charter ,:Int 등 타입어노테이션을 명시하여 사용할 수 있다.

    

   ex) 

       - Objective-c

NSString *tmpStr = @"testStr";


       - Swift 

var tmpStr : String = "testStr";


- Swift 

 var tmpStr = "testStr"; //String

 var tmpInt = 19; //int

 var tmpBool = true; //bool


//따로 명시하지않는 경우에는 알아서 자을 지정한다

 

    - 형변환 NSFoundation 클래스의 형변환 메서드를 이용하지않고도 자료형의 생성자를 사용하여 형변환을 해줄 수 있다.


ex)

     - Objective-c 

        NSString *tmp = @"40";

                               int i = [tmp intValue]; // NSString to int


int i  = 40;

NSString *changeTmp = [NSString stringWithFormat@"%d",i];

//int to String


- Swift  

 var tmpInt = 40; 

 var tmpStr : String (40) // int to String


 var tmpStr :String = "40";

 var i :int = Int(tmpStr) // String to int 


- 논리연산자의 사용은 objective-c와 동일하다.


- 배열

  배열을 사용하는 형태는 objective-c에 가깝다기보다는 C와 유사하다고 볼 수 있을 것 같다.

  objective-c 는 불가변 배열과 가변 배열을 NSArray 와 NSMutableArray 클래스로 나누 어 사용하는 반면 Swift는 두개의 구분 없이 배열안의 내용을 변형 시킬 수 있다.

 Swift 에서 불가변 배열을 원할경우 var 가아닌 let으로 선언한다.


  - Objective-c

           NSArray *tmpArr = [[NSArray alloc]initWithObjects:@"a",@"b",@"c",nil]] ;

                  //배열 선언 및 초기화

   NSMutableArray *tmpArr

                                       = [[NSMutableArray alloc]init];

                                [tmpArr addobject:@"a"];

         [tmpArr addObject:@"df"];

                                        [tmpArr removeObject:@"df"];

                 [tmpArr replaceObjectAtIndex:1 withObject:@"dfds"];

    


     - Swift

               var tmpArr : Array<String> //동적배열 선언

var tmpArr : Array<String>() // 동적배열 선언 및 초기화

var tmpArr : [String]()


               var tmpArr = ["a","b","c"]; //정적 배열


tmpArr.append("a");

tmpArr.insert("b" atIndex: 2);

tmpArr[2] = "dffs"; //인덱스를 이용하는 방식은 수정은 가능하지만 추가는 불가능하다.


tmpArr[1...2] = ["a","b","c"]; //범위 연산자를 이용하여 배열에 접근



- Set

  

- Swift

var name : Set<String> = ["a","b","c"];  

var name : Set<String>();

name.insert("d");

name.remove("a");  // 없을경우 nil 반환.

name.removeAll()   // 배열비우기

name.contains("a") //검색


 - Set 연산 (집합 연산)



- intersect() -> 양쪽 집합에서 공통되는 아이템만 선택하여 새로운 집합을 만들어준다(교집합)


- exclusiveOr -> 양쪽 집합중 한쪽에만 있는 아이템을 선택하여 새로운 집합을 만들어준다


- union() -> 양쪽 집합에 있는 모든 아이템을 선택하여 새로운 집합을 만들어 준다

     중복값은 제거되게 된다.(합집합)


- substract() -> 한쪽 집합에 있는 모든 아이템에서 다른쪽 집합의 공통아이템을 제거한다

   (차집합)


let oddDigits : Set = [1, 3, 5, 7, 9];


let evenDigits : Set = [0, 2, 4, 6, 8];


let primeDigits : Set = [2, 3, 5, 7];


odddigits.intersect(evenDigits).sort();


//[ ]


oddDigits.exclusiveOr(primeDigits).sort();


// [1, 2, 9]


oddDigits.union(evenDigits).sort();


//[0,1,2,3,4,5,6,7,8,9]


odddigits.substract(primeDigits).sort();


//[1, 9]




* 집합은 배열과 유사하지만 순서나 인덱스가 없고 중복된 아이템을 허용하지 않는다.



% 아직은 foundation 프레임워크의 클래스들을 사용해보지않아 위의 것들이 얼마나 활용도가 있을지는 모르겠지만 objective-c에 익숙한 나로써는 swift 문법의 기본 함수들을 얼마나 쓸지는 아직 잘 모르겠다.




'swift 공부' 카테고리의 다른 글

[arcjeen] 6. swift 구조체 클래스  (0) 2017.03.22
[arcjeen] 5. swift closure  (0) 2017.03.21
[arcjeen] 4. swift 함수  (0) 2017.03.21
[arcjeen] 3.swift Optional  (0) 2017.03.21
[arcjeen] 2.swift 자료형 2 (튜플, Dictionary)  (0) 2017.03.21

WRITTEN BY
arcjeen
ios 관련문의 slimforce@naver.com

,

1. ios UILabel


- ios sdk에서 사용되는 가장 기본적인 클래스중 하나. 어플리케이션내에서 표현되는     짧은 텍스트 들은 대부분 UILabel에 담겨져서 표현된다.

 

 - 샘플코드

<헤더파일에 UILabel *testLabel; 선언 후 사용>


<실행화면>



CGPoint screenSize = CGPointMake([[UIScreen mainScreen]bounds].size.width, [[UIScreen mainScreen]bounds].size.height);


CGPoint는 2차원 배열의 형태로 보통 좌표값을 저장하는데 사용해요.

CGpoint 구조체의 생성은 CGPointMake라는 클래스로 하게되는데


UIScreen 클래스의 mainScreen함수는 사용자 디바이스의 스크린 정보를 가져를 가져오게 되는데 여기서 bounds함수로 디바이스의 크기를 가져올수 있습니다.



// uilabel 프레임 크기 지정

    testLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 300, 200)];


    // view 상에서의 uilabel 중심 좌표 지정

    testLabel.center = CGPointMake(screenSize.x/2, screenSize.y/2);


    // uilabel 배경색 지정

    [testLabel setBackgroundColor: [UIColor grayColor]];


    // uilabel textcolor 지정

    [testLabel setTextColor:[UIColor whiteColor]];


    // uilabel 내용 지정

    [testLabel setText:@"테스트라벨"];


    // 시스템폰트 이외의 다른 폰트를 사용할 해당되는 폰트이름을 fontname 작성한다

    //    [testLabel setFont:[UIFont fontWithName:@"fontname" size:14.f]];


    // 라벨내의 텍스트 정렬 방식

    [testLabel setTextAlignment:NSTextAlignmentCenter];


    // 기본 시스템폰트사용시 글자 크기 변경

    [testLabel setFont:[UIFont systemFontOfSize:12.0f]];


     //메인뷰에 테스트 라벨 추가.

    [self.view addSubview:testLabel];




UILabel은 가장 기본적은 UI 요소 이면서도 가장 많이쓰이는 요소이기도 한 만큼

활용도가 무궁 무진 합니다.

UIanimation을 이용한 여러가지 애니메이션 효과를 적용하면 보다 동적인 UI/UX 디자인을하실 수 있습니다.




WRITTEN BY
arcjeen
ios 관련문의 slimforce@naver.com

,