2016년 9월 26일 월요일

generics 1


func swapTwoValues(inout a: T, inout _ b: T) {


JAVA 의 generics 와 다른게 없습니다. 

Type Constraint Syntax

You write type constraints by placing a single class or protocol constraint after a type parameter’s name, separated by a colon, as part of the type parameter list. The basic syntax for type constraints on a generic function is shown below (although the syntax is the same for generic types):  
func someFunction(someT: T, someU: U) {
    // function body goes here
}

T를 써도 되고 U를 써도 되고... C++의 템플릿이 제네릭이랑 동일하니 T가 좋습니다.

swift... 역시 문법은 좀 더 간결하게 하려고 했습니다. T extends 블라블라를 T : 블라블라

func findIndex(array:[T], _ valueToFind: T) -> Int? { ...

그러나 JAVA 의 extends 가 더 직관적이라고 할 수 있겠습니다.

의 소스 중 T를 S 로 바꾸어 보았습니다.

func selectionSort(array: [S], _ isOrderedBefore: (S, S) -> Bool) -> [S] {
  guard array.count > 1 else { return array }
  var a = array
  for x in 0 ..< a.count - 1 {
    var lowest = x
    for y in x + 1 ..< a.count {
      if isOrderedBefore(a[y], a[lowest]) {
        lowest = y
      }
    }
    if x != lowest {
      swap(&a[x], &a[lowest])
    }
  }
  return a
}

let list = [ 10, -1, 3, 9, 2, 27, 8, 5, 1, 3, 0, 26 ]
selectionSort(list, <)
selectionSort(list, >)

if 문 지옥에서 벗어나게 끔 도와주는 where 도 쓸 수 있습니다.

func allItemsMatch<
    C1: Container, C2: Container
    where C1.ItemType == C2.ItemType, C1.ItemType: Equatable>
    (someContainer: C1, _ anotherContainer: C2) -> Bool {
    
    // check that both containers contain the same number of items
    if someContainer.count != anotherContainer.count {
        return false
    }
    
    // check each pair of items to see if they are equivalent
    for i in 0..
        if someContainer[i] != anotherContainer[i] {
            return false
        }
    }
    

where 설명은 여기...

JAVA 에는 WHERE 가 없어도 if 문을 구리게 쓰지 않습니다. && 과 ||을 잘 쓰지요. 수없이 접하는 SQL의 where와 동일한 기능이라 거부감은 없습니다만, where 키워드로 넓혀지는 생각이 더 나은 구조를 짤 수 있다는 생각은 아직 들지 않네요. guard 랑 where는 별로 맘에 안 듭니다.

한편으로는 최근 기술 세미나를 매주 하면서 쉽게 설명하는게 더 나쁠 수도 있다는 생각이 듭니다. 더 복잡해질 수록 좋은 것도 분명 있습니다. 이세돌이 공익광고 나와서 승자는 있을 수도 있지만 패자는 없다는 말. 겸손을 뜻하는 것인데 겸손이 사라지는 것이죠. 쉽게 설명을 들어 어려운 내용을 금방 이해하고 나면 겸손함이 없어 지더라고요. "그게 다 아닌가요?" 합니다. 그래도 깊게 공부해서 사색하고 난 후 그게 다라고 결론을 내리는 과정의 중요함을 깨닫습니다. guard 랑 where 도 그 특성을 알고 많이 써야 겠습니다.

 question mark , whildcard 의 경우 옵셔널이 꿰차고 있고 검색을 하다보면 swift 개발자들이 별로 좋아하지 않는 것 같아서 앞으로도 안 들어갈 것 같습니다. 그럼 람다식도 싫어하던가...
뭐 사실 자바에서도 ? extends 코드는 자주 타이핑 하지만 굳이 익명(?)으로 안해도 T라 써두고 안 쓰면 그만이지 했거든요. 

아무래도 C 가 정말 최강의 언어인 것 같습니다. 뭐든지 최강이 되기 위해서는 상대를 인정해야 합니다. C를 배제하려면 C 없이 hardware specific 한 부분은 바로 ASM으로 연결시켜야 하는데, 수십년간 발전해 왔고 임베디드분야에서 지금도 건재한 C를 넘기는 힘겨워 보입니다. 

프로그래머로서는 그냥 두가지 언어를 다 하는게 좋아 보이구요.

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...