@@ -438,7 +438,7 @@ precedencegroup SqurePrecedence {
438
438
higherThan : MultiplicationPrecedence // 더 낮은 우선순위 그룹
439
439
lowerThan : BitwiseShiftPrecedence // 더 높은 우선순위 그룹
440
440
associativity : right // 결합방향(left / right / none)
441
- assignment : false // 할당방향 사용 (true / false)
441
+ assignment : false // 할당사용 (true / false)
442
442
}
443
443
444
444
infix operator ** : SqurePrecedence // SqurePrecedence를 적지 않으면 DefaultPrecedence를 갖는다.
@@ -526,5 +526,59 @@ struct SmartPhone {
526
526
}
527
527
}
528
528
```
529
+
529
530
타입 메서드로 구현한 사용자정의 연산자는 각 타입의 익스텐션으로 구현해도 된다.
530
- 익스텐션을 통해 타입 메서드로 구현한 사용자 정의 메서드는 [ 익스텐션으로 추가할 수 있는 기능] ( ./../CHAPTER21/README.md ) 에서 확인 가능하다.
531
+ 익스텐션을 통해 타입 메서드로 구현한 사용자 정의 메서드는 [ 익스텐션으로 추가할 수 있는 기능] ( ./../CHAPTER21/README.md ) 에서 확인 가능하다.
532
+
533
+ ### assignment의 간단한 예제
534
+
535
+ ``` swift
536
+ class A {
537
+ var num: Int ?
538
+ }
539
+
540
+ class B {
541
+ var a: A?
542
+ }
543
+
544
+ class C {
545
+ var b: B?
546
+ }
547
+
548
+ precedencegroup SqurePrecedence {
549
+ higherThan : MultiplicationPrecedence // 더 낮은 우선순위 그룹
550
+ lowerThan : BitwiseShiftPrecedence // 더 높은 우선순위 그룹
551
+ associativity : right // 결합방향(left / right / none)
552
+ assignment : true // 할당사용(true / false)
553
+ }
554
+
555
+ infix operator ** : SqurePrecedence // SqurePrecedence를 적지 않으면 DefaultPrecedence를 갖는다.
556
+ func ** (lhs : Int ? , rhs : Int ? ) -> Int ? {
557
+ var ret: Int = 1 ;
558
+ if rhs! > 0 {
559
+ for _ in 1 ... rhs! {
560
+ ret *= lhs!
561
+ }
562
+ } else if rhs! < 0 {
563
+ // 마이너스 지수에 대한 계산
564
+ }
565
+
566
+ return ret;
567
+ }
568
+
569
+ var c: C? = C ()
570
+ print (c? .b ? .a ? .num ** 2 )
571
+
572
+ // assignment가 false 일때 위와 같이 사용 했을때 뜨는 런타임에러
573
+ /*
574
+ error: Playground execution aborted: error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
575
+ The process has been left at the point where it was interrupted, use "thread return -x" to return to the state before expression evaluation.
576
+ */
577
+
578
+ // assignment가 false 일때 모든 옵셔널값이 들어가 있다면 런타임에러는 뜨지 않는다.
579
+ // c?.b = B()
580
+ // c?.b?.a = A()
581
+ // c?.b?.a?.num = 10
582
+ // print(c?.b?.a?.num ** 2)
583
+ ```
584
+
0 commit comments