2010-08-16 4 views
1

Objective C는 '인터리브 된 인수'를 사용한다는 것을 알고 있으며 의도적으로 설계된 것입니다.Objective C에서 여러 인수를 사용하여 메시지 구문을 이해하는 방법은 무엇입니까?

그러나 나는 그것이 왜 인생이 메시지 이름에 첫 번째 인수의 이름을 병합하는 것이 더 쉽게 생각하는지 알고 싶습니다. 아래를 참조

올바른 : [myRectangle setOriginX: 30.0 y: 50.0]
대신
잘못된 : [myRectangle setOrigin x: 30.0 y: 50.0]

[receiver message argument1:value1 argument2:value2...] < < <이 아닌이 하나 더 명확하고 직관적 인 당신에게 사람?

답변

3

선택자는 실제로 메소드의 "이름"을 문자열로 사용하므로 인수는 메소드의 순서대로 전달 될 수 있기 때문에 구현하기가 더 쉽습니다. 이를 통해 Objective-C는 본질적으로 작은 전처리 기 + 원래 런타임 C의 런타임 기능 집합으로 쉽게 작성 될 수 있습니다. 그렇지 않으면 더 복잡 할 것입니다.

Objective-C의 메시징 구문이 Smalltalk에서 파생 되었기 때문에 선택기를 사용하는 것과 똑같은 방식으로 사용 되었기 때문에 더 간단합니다 (C의 전처리 기가 아니지만). 따라서 Smalltalk 구문이 제로입니다.

왜 Objective-C가 수십 년 후에 유행에 들어선 언어로부터 디자인 큐를 가져 오지 않았는지 묻는 것처럼 보입니다. 대답은 다음과 같습니다. 왜냐하면 그들은 아직 주변에 없었기 때문입니다. (키워드 인수가 그때까지 Lisp에서 일반적인지는 모르겠지만, 대부분의 프로그래밍 언어에서는 그렇지 않다.)

+0

네, 아마도 당신 말이 맞아요. 아이폰은 유행이지만, 목표 C는 분명히 아니다 : P – aXqd

+0

안녕, 척, 나는 너의 논평의 첫 번째 단락을 재고했다. 나는 그것이 얼마나 힘들지는 모르겠다. 결국 메시지 전달을위한 새로운 구문을 도입했습니다. 나는 현대의 '키워드 논쟁'을 요구하지 않고있다. 주문을 변경할 수 없다면 괜찮습니다. 우리가 원하는 것은 첫 번째 인수에 두 번째, 세 번째 ... 인수에 할 수있는 것과 별도의 이름을 지정하는 것입니다. – aXqd

+0

인수에 별도의 이름을 지정하지 않습니다. 하나의 선택자가 있습니다. 관습에 따라, 섹션은 인수의 이름을 지정하지만 연결은 고유하지 않습니다. 저는 여러분이 정말로 왜 우리가 선택자의 첫 번째 논리 섹션에 임의의 위치를 ​​채울 수 없는지 묻고 있다고 생각합니다. 그것은 실제로 일치하지 않을 것입니다 *. 다른 임의의 위치에 공백을 둘 수는 없습니다. 인수가있는 콜론에서만 선택자를 분리 할 수 ​​있습니다. * 언어가 이러한 불일치를 포함하도록 고안되었을 수 있습니까? 확실한. 그러나 그것은 그렇지 않았습니다. 그리고 그것은 별 차이가 없습니다. – Chuck

4

짧은 대답을 시도 :

예 :

+0

그렇다면 나는 그 언어로 살 수있을 것 같다. – aXqd

2

난 당신이 내가하지 않는 것이 좋습니다 자바 나 C++와 같은 OOP 프로그래밍 언어와 연관 목표 - C를 이해하려고 노력하는 것이라고 생각합니다. 시간이 지남에 따라 Objc 접근법을 이해하고 좋아할 것입니다. 실제로 그것을 즐기기까지 6 개월이 걸렸습니다. 이제 ObjC 개발 만 즐길 수 있습니다.
어쨌든 ObjC 남자. 라고 다음

방법의 실제 이름 (은 insertObject : atIndex이 :) 콜론 문자를 포함 서명 키워드, 모두의 연결합니다. 콜론 문자는 매개 변수가 있음을 나타냅니다. 메서드 에 매개 변수가없는 경우 이라는 첫 번째 (및 유일한) 서명 다음에 콜론 을 생략합니다. 이 예에서 메서드 은 두 개의 매개 변수를 사용합니다.

Source: Methods and Messaging


편집
메서드를 이름의 ObjC 방법, 내가하지만 메시지 ("무엇을 의미하는지에 대한 더 나은 내가 메서드 이름에 대해 생각하지 않기 때문에 그것을 좋아 다른 오브젝트에 의해 ") 오브젝트 으로 보내고 싶습니다.

NSArray *list = [object_a fromCategory:@"Literature" authorsStartingWith:@"Em"]; 


또는

NSArray *list2 = [object_a fromCategory:@"Literature" authorsStarginWith:@"EM" fromCentury:@"16"] 



봅니다, 같은 자연 언어를 사용하고 object_a에 메시지를 번역하려면 : 카테고리 문학에서 저를 줄 "이봐 객체의 모든 저자는 "em"으로 시작하고 종관 16 "에서 온 stargin입니다. - 이것은 메시지입니다 - 별도의 메서드가 필요하지 않습니다. 이름 - 모두 함께 볼 수 있습니다. 메서드 이름 (사람이 말한대로).
"메소드 오버로딩"이라고 불렀던 것을 수행하는 데 ObjC 방식으로 얼마나 우아하고 명확합니까?

+2

ObjectiveC는 다른 언어보다 고전적인 OOP (예 : Smalltalk)입니다. – Mark

+1

실제로 Objective C는 C++ 및 Java와 같은 언어보다 "클래식"OOP에 훨씬 더 가깝습니다. 메서드 이름 지정 구문은 스몰 토크의 메서드 이름 지정 구문과 거의 동일하며 프로그래밍 모델은 C++ 및 Java보다 Smalltalk에 사실입니다. – JeremyP

+0

고전적인 oop로 나는 그들이 업계 표준이기 때문에 자바와 C++을 의미하지만 더 명확하게 대답을 편집 할 것입니다. – andreiursan

관련 문제