inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Trở thành một nhà phát triển iOS thực sự thành công [từ những điều cơ bản đến công việc thực tế]

24. Hàm_2

Function Types Error

Đã giải quyết

34

jj4783

25 câu hỏi đã được viết

0

cal라는 함수를 옵셔널로 타입지정만 해둔채로, 타함수에서 다른 함수를 할당시키는 예제가 제 에디터에서는 에러가 나는데 원인 알 수 있을까요

func plus(n1: Int, n2: Int) -> Int {
    return n1 + n2
}

func minus(n1: Int, n2: Int) -> Int {
    return n1 - n2
}

var calc: ((Int, Int) -> Int)?

func selectButton(type: String) {
    if type == "+" {
         calc = plus
    } else if type == "-" {
         calc = minus
    }
}

var target1 = 1
var target2 = 3

func showResult() {
    calc?(target1, target2)
}
Main actor-isolated var 'calc' can not be mutated from a nonisolated context
스크린샷 2026-07-10 오후 1.22.04.png.webp

?

ios swift 동시성

Câu trả lời 1

0

enilv0529

예전 Xcode에서는 동시성 검사가 느슨해서 실행됐지만, 최신 Swift에서는 전역 가변 변수인 calc를 MainActor 영역 밖에서 변경하면 에러가 발생합니다.

calc와 이에 접근하는 함수들을 모두 @MainActor로 지정하면 동작합니다.

func plus(n1: Int, n2: Int) -> Int {
    return n1 + n2
}

func minus(n1: Int, n2: Int) -> Int {
    return n1 - n2
}

// 함수를 저장하는 옵셔널 변수
@MainActor
var calc: ((Int, Int) -> Int)?

@MainActor
var target1 = 1

@MainActor
var target2 = 3

// calc를 변경하므로 @MainActor 지정
@MainActor
func selectButton(type: String) {
    if type == "+" {
        calc = plus
    } else if type == "-" {
        calc = minus
    } else {
        calc = nil
    }
}

// calc와 target 값을 사용하므로 @MainActor 지정
@MainActor
func showResult() {
    if let result = calc?(target1, target2) {
        print(result)
    } else {
        print("연산자가 선택되지 않았습니다.")
    }
}

// 실행
selectButton(type: "+")
showResult() // 4

calc의 옵셔널 함수 타입과 calc = plus 같은 함수 할당 방식은 정상입니다.

에러의 원인은 calc가 MainActor에 속해 있는데, 기존의 selectButtonshowResult가 MainActor에 속하지 않은 상태로 접근했기 때문입니다.

0

jj4783

감사합니다 !!!

Static 선언 시 에러 발생

0

22

1

클로저의 형태로 만들다

0

42

1

패싱1강에서 강의중에 질문 있습니다.

0

93

2

table view 없음

0

126

2

에러 질문 [UITextField setDataSource:]: unrecognized selector sent to instance 0x107079600"

0

229

2

Main interface 지정 방법

0

191

1

Closure_3 Capture List에 참조 타입 값을 작성할 경우에도 deinit 실행되는 이유가 뭘까요?

0

194

2

TodoCell UIview 생성 후 연결 시 오류

0

441

2

테이블 뷰 데이터 업데이트 관련 질문

0

366

2

TODO List Coredata 질문입니다.

0

358

1

혹시 추가예정인 강의가 대략 언제쯤 나오는지 알수있을까요..?

0

377

1

swift에서 import 헤더를 안해도 되는이유가 궁금합니다.

1

648

1

closure 3 에서 weak로 준 부분이 궁금합니다.

0

342

1

concurrency_1 강의 코드 결과 중 이해가 안가는 부분이 있습니다

0

346

1

self.navigationBar.topItem?.leftBarButtonItem을 해도 button이 보이지 않습니다

0

606

2

func 기능을 쓸때 self. 을 왜쓰는지 이해가 잘안되네요 ㅠㅠ

0

426

1

Closure2 강의에서 예문처럼 똑같이 myfunc2, myfunc3 만들었을때

0

392

1

클론강의 tableViewCell

0

416

1

Location.pin강의에서 self질문이요

1

269

1

넷플릭스 table cell 관련해서 질문이 있습니다.

0

523

1

Capturing Valus

0

307

1

안녕하세요 todolist강의중에서 UI구성중 xib파일 오토레이아웃질문입니다.

0

331

1

환율 강의 테이블뷰에서 데이터 관련 질문있습니다.

0

570

2

환율 네트워크처리1 질문있습니다.

0

285

1