MVC 模式简介

Pitch Perfect 코드를 작성하기 전에 iOS 개발자에게 유용한 가벼운 패턴 하나를 배워보도록 하겠습니다 여러분에게 MVC 패턴을 소개해드리겠습니다

우리는 이 패턴으로 Pitch Perfect를 만들 것입니다 따라서 이 패턴을 알고 있으면 우리가 무엇을 하고 있고, 무엇이 필요한 지 쉽게 파악할 수 있을 것입니다 모델, 뷰, 컨트롤러 패턴은 80년대 Mac 개발 때 만들어졌습니다 그리고 여전히 오늘날까지도 유용한 패턴이죠 이 패턴은 모델 뷰 컨트롤러, 또는 줄여서 MVC로 부릅니다

Pitch Perfect는 세 부분으로 나누어 생각해볼 수 있습니다 사용자에게 버튼을 보여주는 뷰와, 녹음된 오디오 파일을 저장하는 모델, 그리고 모델로부터 데이터를 불러오고 이를 뷰에 나타내는 컨트롤러가 있습니다 여러분의 앱이 가지고 있는 데이터를 생각해보십시오 Pitch Perfect의 경우 단순히 오디오 파일만 가지고 있죠 하지만 여러분이 iOS 개발자로 성장하면서 지금보다 훨씬 더 많은 데이터를 저장해야 하는 복잡한 앱들을 만들게 될 것입니다

데이터를 저장하고 유지하는데 필요한 일들은 전부 모델과 관련 있습니다 다이어그램 다른 쪽에는 뷰가 있습니다 사용자가 화면으로 보면서 인터랙션하는 부분을 뷰라고 합니다 뷰는 데이터나 모델에 대하여 전혀 모릅니다 뷰는 그저 전달받은 데이터 집합을 보여줍니다

뷰는 사용자 인터페이스일 뿐입니다 뷰와 모델 사이에서 뷰에게는 데이터를 전해주고 모델에게는 뷰에서의 활동을 알려주는 것은 컨트롤러입니다 사용자 액션이 뷰에서 일어나면 컨트롤러는 감지합니다 필요하다면 모델을 갱신해줍니다 일부 외부 이벤트에 의해 모델이 변경된다면 모델은 컨트롤러에게 알려서 필요시 뷰를 갱신하도록 합니다

왜 모델 데이터 코드를 전부 뷰 안에 넣지 않는지 궁금하실 것입니다 같은 데이터의 일부분을 보여주기 위해 서로 다른 뷰를 보여줄 필요가 종종 있습니다 그럴 때는 어떻게 해야할까요? 코드를 복사 붙여넣기 하면 이 프로젝트는 곧 친구들로부터 'copy pasta'로 불릴 것입니다 파스타는 먹기 좋지만 코드 안에 담겨 있으면 끔찍한 일이죠 모델과 뷰와 컨트롤러의 역할을 나누어 놓는 것은 코드를 유지보수하고 가독성을 높이고 재사용 가능하도록 만듭니다

여러분은 저와 Pitch Perfect를 함께 만들어 가면서 모델과 뷰와 컨트롤러가 어떻게 서로 협력하는지 볼 것입니다 학생들은 iOS를 개발하면서 이러한 패턴과 아이디어들을 매우 쉽게 머리 속에 그릴 수 있었습니다 이 패턴을 통해 여러분의 앱을 체계적이고 쉽게 개발할 수 있습니다

mvc-1

>> 스피커 :의 개선하자 과정의 몇 가지를 감안하여 홈페이지 공통점 특히 내 페이지의 모든 하나의 꼭대기 HTML 태그, 머리있다 태그, 제목 태그, 그리고 더

우리는 대신에 사람들을 넣어 어떤 경우 별도의 파일에 태그? 우리는 사람들을 넣어 특히, 어떤 경우 단독 파일에 headerphp라고? >> headerphp에서 그냥 HTML입니다, 예전 정확하게 HTML indexphp를 꼭대기 footer

php에서, 그 사이에,이다 이어야하는 데 HTML indexphp 파일의 맨 아래 이 HTML을 포함하는 방법을 지금 indexphp 파일 내부에? 음, 어디 보자 >> index

php 파일의 맨 위에, 나는 할 수있다 단순히 headerphp를 필요로하는 그래서 PHP의 통역 효과적으로 사본 headerphp의 내용을 붙여 넣습니다 바로 내 파일 꼭대기 마찬가지로, indexphp 파일의 맨 아래에, 나는 footer

php를 요구할 수 있습니다 유일한 코드는 이제 수동으로 어렵다 indexphp 파일의 내부 코드 정렬되지 않은 목록, 이는 결국 파일에 파일의 변경 >> 사실, 우리가 지금 lecturesphp 보면, 그것은 유사 필요 header

php과 footerphp하지만, 자신의 순서가 지정되지 않은 목록이 있습니다 week0php는 매우 유사한 구조를 갖는다 하지만 대신에 링크가 그 PDF 파일 그리고 week1은 마찬가지로,이 자신의 PDF 파일에 대한 링크

>> 이제 우리는 하나의 기능을 부여했습니다 우리는 규정 된 H1 태그를 잃었습니다 각 파일의 이름 그러나 우리는 오래 전에 그것을 다시 가져올 수 있습니다

Lecture 2: MVC's

이 부제는 라이센스 계약, 지식 공유, 서명, 비상업적 인 사용, 같은 방식으로 공유하는 자원 봉사자가 기고합니다 스탠포드 대학

>> 스탠포드 CS193P에 오신 것을 환영합니다 스탠포드 CS193P 과정에 오신 것을 환영합니다 iOS 용 응용 프로그램 개발 : 이것은 강의 2, iOS 응용 프로그램 개발입니다 오늘은 2017 년 가을 학기입니다 2017 년 가을

오늘은 첫 15시 또는 두 번째 레슨을 보내 게 될 것입니다 오늘 나는 15 세를 보내야한다 20 분 Model-View-Controller에 대한 이야기, Model-View-Controller에 대해 20 분 이야기 이 디자인 패러다임은 우리가 항상이 디자인 패턴을 수행해야한다고 말했고, 나는 항상 우리가 iOS 용으로 개발할 때, iOS를 개발할 때이 디자인 패턴을 사용합니다 그런 다음 모델 뷰 컨트롤러를 집중 앱에 적용하여 모델 뷰 컨트롤러를 플롭 게임에 적용 개념을 처음으로 보게 될 것입니다 개념을 먼저 이해하게 될 것입니다

그런 다음 실제 상황을 보게됩니다 좋아, 실제 적용 사례를 살펴 봅니다 그런 다음 모델 – 뷰 – 컨트롤러, 그것은 무엇입니까? 그것은 본질적으로 모델 – 뷰 – 컨트롤러 란 무엇입니까? 그것은 일종의 것이다 시스템의 모든 객체를 나눠서 우리의 객체를 우리 시스템의 세 개의 캠프로 나눕니다 3 개의 캠프, 하나의 캠프,이 푸른 캠프는 모델 캠프의 방법입니다

하나는이 파란 모델 (모델) 이것은 UI 독립적 인 개체 집합입니다이 개체는 UI에 종속되지 않는 일련의 개체입니다 앱의 내용은 집중 게임의 경우 프로그램에서 수행 할 수있는 작업입니다 우리의 플럽 게임 집중력을하는 법을 알고있는 앱의 일부로, 프로그램에서 플럽 게임의 규칙을 아는 부분입니다 카드 대조 방법, 카드 ​​제거 방법, 일치 방법, 카드 ​​제거 방법을 알고 있습니다

언제 카드를 뒤집을 지, 그 모든 것을 알고 있습니다 때려 눕히고, 모든 것을 알아야합니다 집중에 관한 모든 종류의 지식입니다 플럽 게임과 관련된 모든 정보와 규칙을 알고 있습니다 게임이지만 화면에 표시되는 방법에 대해서는 아무 것도 없습니다

그러나 이것이 화면에 어떻게 표시되는지는 알 수 없습니다 컨트롤러 캠프의 모든 책임은 컨트롤러의 책임입니다 그래서 컨트롤러 캠프는 어떻게 당신의 집중 게임이 화면에 나타납니다 당신의 플럽 게임은 어떻게 화면에 나타 납니까? 그래서 모델은 앱에 관한 것이므로 모델은 프로그램의 기능입니다 컨트롤러는 화면에 나타나는 방식이며, 컨트롤러는 프로그램이 화면에 표시되는 방식입니다

그리고 View 캠프는 컨트롤러의 미니언입니다 그러면 View 캠프는 컨트롤러의 부하입니다 이들은 매우 일반적인 UI 요소입니다 (예 : UI 버튼) UIButton과 같은 일반적인 UI 구성 요소입니다 UI보기 컨트롤러 심지어 UI 레이블, 심지어 UIViewController 및 UILabel 모든 종류의 일반적인 것들, UI 것들, 모든 공통 UI 구성 요소 제어기가 모델과 통신 한 후 제어기가 모델과 통신해야한다는 것 앱에서 UI로 진행되는 모든 작업을 게임으로 가져옵니다

게임과 같은 정보를 얻으면보기에 표시됩니다 따라서 뷰는 컨트롤러의 일반적인 부하입니다 따라서 뷰는 일반적이므로 컨트롤러의 부하 3 개의 캠프가 있습니다 이제 MVC가 전부입니다 MVC라고하는 모델 뷰 컨트롤러 3 캠프입니다

이 캠프 간의 의사 소통을 관리 하시겠습니까? 그렇지만 가장 중요한 것은 세 캠프 간의 의사 소통을 규제하는 것입니다 이 캠프에 물건을 넣으면,이 세 캠프에 물건을 놓습니다 그들은 말할 때 어떤 규칙에 순종해야합니다 그래서 여기에 도로 표지판을 그렸습니다 그래서 여기에 도로 교통 표시를 사용합니다

근사한 작은 도로 표지판을 보았습니다이 도로 교통 표지를 보았습니까? 그들은 대표한다 다양한 종류의 커뮤니케이션이 허용됩니다 캠프에 대해 자세히 살펴 보겠습니다 자세히 살펴 보겠습니다

컨트롤러가 모델과 대화하여이 컨트롤러가 모델에 액세스 할 수 있습니다 그 방향으로가는 완전한 점선의 흰색 선입니다이 방향은 흰색 점선입니다 큰 녹색 화살표를 원하면 언제든지 건너 뛸 수 있습니다 언제든지 통과 할 수 있습니다

녹색 화살표를 사용하여 컨트롤러는 원하는 모든 모델과 통신 할 수 있습니다이 컨트롤러는 모델과 자연스럽게 통신 할 수 있습니다 그것은 컨트롤러의 일이기 때문에 컨트롤러의 작업이 가능해야하기 때문에 가능해야합니다 이 것을 사용자에게 제시하십시오 따라서 모델을 사용자에게 보여줘야하므로 필요한 것입니다

모델에 액세스 할 수 있습니다 모델에 액세스 할 수있는 커다란 녹색 화살표입니다 따라서 이것은 확실한 녹색 화살표입니다 그리고 이것은 모델과 대화하는 컨트롤러입니다 컨트롤러는 모델에 액세스 할 수 있습니다

모델의 액세스 모델에 대한 무제한 통신은 기본적으로 무제한입니다 공개적으로 사용할 수있는 기능입니다 공개적으로 사용할 수있는 한이 기능은 무엇입니까? 이건 어때? 방향? 글쎄, 비슷하게 여기, 그것의 부하들, 여기 비슷하다,보기는 종속적이다 컨트롤러는 미니언을 제어 할 수 있어야하므로 컨트롤러는 부하 직원을 제어 할 수 있어야합니다 그렇게 넓게 열린 녹색 화살표입니다

이것은 가능합니다 내 방향도 녹색 화살표로 표시됩니다 그리고 이미 녹색 화살표를 보았고 그런 "녹색 채널"을 보았습니다 컨트롤러가 집중도에서 볼 수 있습니다 플롭 게임에서 컨트롤러에서보기로 그것은 출구라고 불 렸습니다

우리는 뒤집기 출구를 가지고있었습니다 카운트 레이블, 그리고 물론 플립 카운트 flipCountLabel의 출구에 대해 이야기 할 수 있습니다 물론 flipCountLabel을 말할 수 있습니다 우리가 UI에 나타 내기를 원한다고 말하기 위해 레이블을 붙이고 원하는 것을 말하십시오 UI에서 원하는 것은 컨트롤러의 특권입니다 이것은 컨트롤러의 특권입니다

컨트롤러가 모든 사람과 대화 할 수 있다는 것을 알 수 있습니다 컨트롤러는 모든 사람과 대화 할 수 있습니다 한 번에 꽤 많이 다른 종류의 다른 캠프들 사이 의사 소통이란? 모델 얘기는 어때? 모델과 같은 보기로 직접? 좋아요, 거의 불가능합니다보기에 직접 액세스 할 수 있습니까? 좋습니다

기본적으로 불가능합니다 왜 그럴 수 없습니까? 두 가지 이유가 있습니다 왜 불가능합니까? 두 가지 이유가 있습니다 하나는 모델이 UI에 독립적이며보기 전용입니다 첫 번째로 모델은 UI와 독립적이며 뷰는 다음과 같습니다

UI가 포함되어 있으므로 UI가 UI를 표시 할 책임이 전혀 없습니다 그래서 무관 한 UI 캠프 독립적 인 것은 그러한 UI 의존적 인 문제들과 대화 할 수 있습니다이 UI에만 접근하는 것은 불가능합니다 보기와 같은 또 다른 이유는 이러한 View 것들입니다 또 다른 이유는보기입니다

버튼이나 슬라이더와 같은 일반 객체입니다 어떻게 버튼이나 슬라이더와 같이 일반적으로 사용할 수 있습니까? 버튼은 집중 게임에 대한 아이디어를 가지고 있습니까? 어떻게 플럽 게임인지 버튼에서 알 수 있습니까? 그럴리 없어요 그걸 알 수있는 방법이 없어요, 일반적인 것입니다 불가능합니다 버튼은 보편적이며,이 게임을 깔끔하게 알 수는 없습니다

따라서이 둘 사이에는 의사 소통이 전혀 없으므로 둘 사이의 의사 소통은 불가능합니다 둘, 네가 어떤 의사 소통을하는 걸보고 싶지 않아 네가 숙제에서 너를보고 싶지 않아 숙제 나 다른 곳에서이 캠프들 사이에서 두 캠프가 의사 소통을하도록하십시오

그래서 거기에 이중 노란색 선이 있습니다 그래서 여기에 이중 노란색 선이 있습니다 건너 뛰지 말고, 쉬운 일 이네 과거는 건너 뛸 수 없어 좋아, 이것은 간단하다

뷰가 컨트롤러에 다시 회신합니까? 아마도 컨트롤러를 알리기 위해 뒤집힌 뷰일까요? 이 가능성 여기서 가장 흥미로운 커뮤니케이션 경로는 커뮤니케이션하는 가장 흥미로운 방법입니다 뷰는 해당 컨트롤러와 대화 할 수 있습니다 물론 뷰는 컨트롤러에 알려야합니다 단추가 눌려 지거나 다른 것, 어떤 의미에서 "단추를 누를 때"와 같이 필요합니다 그러나 의사 소통을 할 때 의사 소통을해야합니다

이 통신은 맹인이어야하며 구조화되어야하며 표준화 된 익명 통신 메커니즘이어야합니다 이것들은 일반 뷰 객체이기 때문에 블라인드해야합니다보기가 일반 객체이기 때문에 "익명"이라고합니다 UI 버튼은 집중 UIButton에 대해 아무것도 모릅니다 게임 컨트롤러, 컨트롤러와 대화 할 때,이 게임 컨트롤러가 컨트롤러에 알릴 때 그것은 그것이 집중 게임이라는 것을 실제로 알지 못합니다

그것이 플럽 게임이라는 것은 알려져 있지 않습니다 컨트롤러와 그 컨트롤러에 구성되어 있습니다 표준이 있다고 해봅시다 우리는이 통신이 계속되기를 원하기 때문에이 통신이 성립되기를 원하기 때문에 일반적인 객체는 어떻게 생각 하느냐에 대해 조금 앞서 생각해야한다 이 Controller 객체와 통신하고 싶을 수도 있습니다 Controller 객체와 통신하는 방법 그래서, 당신은 이미 하나의 구조화 된, 눈먼 방법을 알고 있습니다

의사 소통을위한 귀하의 견해, 그리고 그것은 목표 행동입니다 표준화 된 익명 의사 소통, 즉 목표 행동 우리가 Ctrl 키를 드래그하여 만들 때 touchCard 메서드를 만들었습니다 컨트롤 드래그 앤 드롭을 계속하면 메소드 touchCard가 생성됩니다 목표 작업입니다 그리고 모든 컨트롤러가해야합니다

이것은 목표 개체 작업입니다 그리고 컨트롤러가해야합니다 Kinda는 대상 자체를 정지시킵니다 즉, 대상 개체로 설정하는 것입니다 즉, create 터치 카드와 같은 메소드, UI 버튼과 터치 카드 메소드, UIButton 다른 것들은, 그들은이 행동을 취할 수 있고, 어떤 종류의 통제는이 수술 방법을 얻을 수 있습니다

버튼을 누를 때마다 버튼을 누를 때마다 그들은 단지 타겟을 호출합니다 이것은 매우, 버튼은 타겟 오브젝트의 메소드를 호출합니다 이것은 매우 아주 간단한 종류의 블라인드 구조 통신 그러나 매우 간단한 표준화 된 익명 통신 때로는 더 복잡한 의사 소통이 필요하지만 때로는보다 복잡한 의사 소통이 필요합니다 예를 들어,보다 복잡한 일반 뷰와 마찬가지로,보다 복잡한 일반 UI 구성 요소가 있습니다

스크롤보기는 스크롤보기와 같고 스크롤보기는 다음과 같이 할 수 있습니다 어떤 이미지 또는 그와 비슷한 것을 스크롤하고 그림을보기 위해 돌아 다니십시오 컨트롤러에게 알려야 할 수도 있습니다 컨트롤러에 알려야 할 수도 있습니다 나는 끝까지 스크롤했다

내가 여기 아래로 스크롤 할 수 있었느냐? 나는 아래로 스크롤했다, 나는 계속 내려갈 수 있니? 세로 또는 가로로 스크롤 할 수 있습니까? 내 운동 방향이 세로 또는 가로입니까? 컨트롤러와 대화를하고 싶습니다 작업을 완료하려고합니다 일을하기 위해 일하고 있습니다 그런 종류의 컨트롤러로 통신합니다 이를 달성하기 위해 스크롤 뷰가 스크롤 뷰의 일부로 정의하는 미리 정의 된 메서드는 몇 가지 메서드를 정의합니다

대리자 란 무엇입니까? 따라서 대리인은 프록시의 일부인 대리인에게 속한 것입니다 에이전트는 변수입니다 뷰를 스크롤하면이 var에 객체가 저장됩니다 객체를 저장하는 뷰에서 변수 스크롤 우리가이 객체에 대해 알고있는 것은 그것이 특정 수의 메시지 이러한 메시지의 대부분은 특정 수의 특정 방법에 응답 할 수 있습니다

이 방법의 대부분 will, should, or라고하는 단어로 시작하십시오 나는 여기로 스크롤해야합니까? 예를 들어, 나는 여기에서 스크롤 할 것입니다 거기서 스크롤 할 수 있습니까? 여기까지 아래로 스크롤했는데, 이는 전형적인 델리게이트 메서드입니다 여기서는 스크롤했는데, 전형적인 프록시 메서드입니다 그리고 컨트롤러는 프로토콜이라고 불리는 메커니즘을 사용하여 컨트롤러는 프로토콜, 프로토콜 우리는 다음 주에 대해 이야기 할 것입니다, 우리는 다음 주에 이야기 할 것입니다

스크롤보기를 말할 수 있습니다 스크롤보기를 말할 수 있습니다 나는 당신의 대리인이고, 모든 스크롤 뷰는 내가 당신의 에이전트라는 것을 알지만, 스크롤 뷰는 오직 알고 있습니다 이러한 의지를 구현하고,해야하며, 그렇게 했는가 나는 이러한 의지를 구현 했는가? 클래스에 대해 알지 못하고 스크롤 뷰는 다른 정보를 알지 못하며 어떤 클래스인지 알지 못합니다

그것이 집중 게임과 관련이 있다는 것을 모릅니다 우리의 플럽 게임인지는 모릅니다 분명히 아무것도 모릅니다 분명히 아무것도 모르는 것이 아니라 단지 알고 있습니다 컨트롤러가 그것을 구현합니다

그래서이 컨트롤러는 프록시 메소드를 구현합니다 우리는 약 2 주 후에 대표단을 볼 것입니다 사용을 시작하면 약 2 주 후에 프록시 모드가 보입니다 보다 복잡한 UI 개체 이제 더 복잡한 UI 개체를 사용하기 시작할 때 또 다른 중요한 점이 있습니다 또 다른 중요한 점은 MVC 모델에서 기억하는 것은 뷰입니다

MVC 모드에서 뷰를 기억합니다 이러한 일반적인 것들, 이러한 일반적인보기 자신이 표시하고있는 데이터를 소유 할 수 없습니다 즉, 표시하는 데이터를 제공 할 수는 없습니다 표시된 데이터를 작성할 수 없으므로 표시 할 데이터를 가지지 않습니다 인스턴스 변수의 일부입니다

이제는이 이유가 무엇입니까? 인스턴스 변수의 일부 (각 객체 포함) 왜? 보기가 전체 iPod 음악을 보여주고 있다고 가정 해 보겠습니다 전체 iPod 음악 라이브러리를 보여 드리겠습니다 도서관에 5 만 곡이 들어 있다고 가정 해 봅시다 예를 들어 5 만 곡이 있습니다

우리가 할 수 없다는 것은 전혀 의미가 없으며 전혀 이유가 없습니다 목록보기 또는 무언가, 목록의 일부 일반보기 목록보기, 목록을 보여주는 일종의 일반보기 50,000 가지의 예제를 가져와 50,000 곡을 저장할 수 있습니다 대신,이 프로토콜 메커니즘을 대신 사용하여 유사한 계약을 사용해야합니다 특수 메시지 세트를 다른 특별한 방법으로 보내십시오 그리고 그들은 데이터와 같은 메시지이며, 데이터를 제공합니다 또는이 방법은이 곳에서 데이터를 제공하는 것을 포함합니다

얼마나 많은 항목이 있습니까? 그리고 컨트롤러가 표시하거나 표시 할 항목 수를 구현 한 다음 컨트롤러가 이러한 방법을 구현합니다 따라서 모델과 대화하고 뷰에 대한 데이터를 얻을 수 있습니다 컨트롤러는 모델에 액세스하여 뷰에 필요한 데이터를 가져옵니다 예를 들어, 테이블 뷰 (테이블 뷰와 같은 큰 스크롤 목록)는 긴 스크롤 목록입니다 iOS에있는 일반적인보기 항목의 종류로, iOS에서 제공하는 일반적인보기 구성 요소입니다 모든 iPad 뮤직에서 스크롤 할 때 iPad 음악 라이브러리의 내용을 앞뒤로 스 와이프하면 현재 보여주는 노래를 묻는 것입니다 오른쪽에 표시되는 노래를 요청합니다

5 만 개가 있으며, 앞뒤로 움직여 총 5 만 개의 머리로 스크롤됩니다 한 번에 10 개를 표시합니다 그래서 묻는 중일 때마다 매번 10 번만 표시 할 수 있습니다 컨트롤러는 다음 10을 주며 컨트롤러는 다음 10을 제공합니다 여기에 10 개를 줘, 여기에 10 개의 노래를 줘

컨트롤러가 모델로 돌아 가면 컨트롤러가 모델로 바뀝니다 아마 멋진 빠른 SQL 데이터베이스 또는 뭔가이며, 곧 SQL 데이터베이스 클래스 수 있습니다 데이터를 가져 와서 뷰로 넘겨줍니다 좋아, 데이터를 가져 와서 뷰에 전달합니다 이것은 동일한 메커니즘을 사용하는데, 테이블 뷰는이 메소드가 다시 동일하고리스트 뷰 이 점에 관해서는 iPod에 대해 아무 것도 모릅니다

이 데이터의 출처를 알지 못합니다 iPod인지 여부는 알 수 없습니다 음악 앱은 데이터 제공 업체이자 음악 프로그램이라는 것을 알고 데이터를 제공 할 수 있다는 것을 알고 있습니다 우리는 이런 종류의 데이터 소스를 위임이라고 부릅니다 좋습니다

그래서이 프록시를 데이터 소스라고 부릅니다 데이터 소스와 위임을 모두 볼 수 있습니다 나중에 볼 수 있습니다 데이터 소스 및 프록시 매우 유사한 것은 다른 종류의 메소드 일 뿐이며,이 두 메소드는 매우 유사합니다 단지 두 개의 다른 메소드 물론 이러한 방법은 종류에 따라 다릅니다

물론 이러한 방법은 특정 UI 요소 중 미리 설정된 목록이 아니며 UI 구성 요소에 따라 달라지며 고정되어 있지는 않습니다 해당 UI 요소로 이동하면 UI 구성 요소의 일종입니다 그래서 이것은 보기가 컨트롤러와 통신 할 수 있고 컨트롤러 통신을 볼 수있는 통신 구조화되어 있으며, 미리 정의 된 것입니다 표준입니다 사전 준비가 잘되어 있습니다

이 모든 통신이 진행되기 때문에이 방향의 모든 통신 우리가 MVC에서 컨트롤러의 일을 말하는 방향은 MVC에서 컨트롤러의 역할을 말합니다 모델 정보를 해석하고 형식을 지정하려면 모델의 정보를 형식으로 변환해야합니다 보기, 그것이 그 주된 목적입니다보기에 제공된, 이것은 그것의 주요 목적입니다 그것도 다른 방향으로 가고 있습니다 반대 방향으로도 처리해야합니다

모델의 뷰에서 사용자 상호 작용을 해석합니다 뷰의 사용자 상호 작용을 모델의 데이터로 변환합니다 통역사는 앞뒤로 의사 소통하며 앞뒤로 의사 소통을 담당합니다 모든 커뮤니케이션의 중심입니다 모든 커뮤니케이션의 중심입니다

모델은 어떻습니까? 모델이 컨트롤러와 대화 할 수 있습니까? 모델이 컨트롤러에 알릴 수 있습니까? 모델이 UI이기 때문에 직접적으로 모델이 아니기 때문에 분명히 직접적이지 않습니다 독립적이며 컨트롤러는 근본적으로 UI에 종속적이며, 관련성이 없으며 컨트롤러는 기본적으로 UI에 종속적입니다 직접적으로 처리 할 수는 없지만 직접 통신 할 수없는 메커니즘이 있습니다 그러나 방법이있다 예를 들어, 일부 데이터가 변경된 경우와 같이 통신 할 모델은 데이터가 변경 될 때 모델이 알림을 발행 할 수있게합니다

그리고 관심있는 UI가 필요합니다 업데이트하는 방법입니다 업데이트하는 모델을 사용하는 방법입니다이 메서드는 I를 구현합니다 라디오 방송국 모델을 호출하면 본질적으로 라디오 모드라고 부릅니다

기본적으로 모델 알려진 라디오 방송국에서 방송 시작 알려진 방송국에서 방송 시작 그리고 컨트롤러가 올라와있는 상태에서 컨트롤러를 조정하면이 라디오를들을 수 있습니다 오하이오의 말을 듣고 모델 라디오에서 뭔가 바뀌었고 모델 라디오가 변화가 일어 났을 때 그 소리를 들었습니다 Station에서 큰 녹색 화살표를 사용하면 컨트롤러는 "녹색 채널"을 사용합니다 모델과 대화하고 변경 날짜를 얻거나 모델에 액세스 한 다음 변경된 데이터를 가져 오려면 어쨌든 이것은 iOS 등에서 라디오 방송국 모델입니다

그래서 그것은 라디오와 비슷한 메커니즘을 사용합니다 iOS에서 알림 또는 KVO, 키 값 관측이라고하며 이것을 알림 또는 키 값 관측 (KVO, 키 값 관측)이라고합니다 우리는 몇 주 안에 그것들에 대해서 이야기 할 것이고, 그래서 우리는 몇 주 안에 이야기 할 것입니다 그래서 우리는 모델에서 방송의 종류, 와우 같은 것들 변화하고 있습니다 이제 사람들이보기 튜닝을 할 수 있는지 물었습니다

어떤 사람들은 경청 할 것을 청합니다 라디오 방송국에보기는 라디오 방송국에만 조정할 수 있습니까? 정말로 말하고 싶다면, 그 견해는 오직들을 수 있습니다 다른 UI와 같은 컨트롤러 라디오 방송국, 컨트롤러 라디오 또는 기타 UI 관련 물건 뷰는 UI의 기본 요소이지만보기 드문 경우이긴하지만보기가 UI의 기초이기 때문에보기 드물지만 보통 라디오 방송국은 데이터가 변경되었다는 의사 소통에 사용 된 모델에서 일어나는 일을 의사 소통하는 모델 데이터 또는 뭐든이 MVC는 MVC의 모음입니다 이 MVC, 모델, 뷰, 컨트롤러 모음 일반적으로 iPhone의 한 화면을 제어하는 ​​데만 사용되거나 일반적으로 iPhone의 인터페이스를 제어하는 ​​데만 사용됩니다

iPad에서 어쩌면 그것은 작은 하위 장소 또는 iPad에서 인터페이스를 제어 할 수 있습니다 제휴사 인터페이스를 제어 할 수 있습니다 어쩌면 iPad에서와 마찬가지로 어쩌면 하나의 MVC가 하나의 공간을 제어합니다 예를 들어 iPad 에서처럼 MVC가 인터페이스를 제어 할 수 있습니다

다른 MVC가 다른 장소를 제어하고 다른 MVC가 다른 인터페이스를 제어합니다 어쩌면 세 번째 MVC가 다른 공간을 제어 할 수도 있지만 세 번째 MVC가 다른 인터페이스를 제어 할 수도 있지만 iPhone에는 하나 이상의 화면이 없지만 iPhone에는 여러 개의 인터페이스가 없습니다 하나의 MVC에 의해 제어되므로 MVC의 종류는 동시에 MVC에 의해 제어됩니다 그래서 MVC는 여전히 일반적으로 하나의 화면, UI를 그룹화하는 하나의 iPhone 화면, 일반적으로 인터페이스, iPhone 대부분의 앱에는 수많은 화면이 있습니다 따라서 대부분의 프로그램에는 많은 인터페이스가 있습니다

당신은 당신의 설정을 가지고, 당신은 당신의 모든 다른 기능을 가지고 설정 인터페이스, 다른 기능을 가지고 앱, 톤 및 톤이 계속 진행되므로 프로그램에 많은 인터페이스가 있습니다 여러 MVC로 어떻게 응용 프로그램을 만들 수 있습니까? 그렇다면 여러 MVC로 프로그램을 작성하는 방법은 무엇입니까? 여러 MVC 응용 프로그램이 이렇게 보입니다 나는 여러 MVC가 있습니다 여러 MVC 프로그램이 이렇게 보입니다 나는 MVC가 많다

똑바로이 보라색 것들은 모두이 보라색이야 모든 컨트롤러, 하나의 MVC가 상호 작용하기를 원할 때 모든 컨트롤러입니다 MVC가 원할 때 바로 여기 다른 MVC와 함께, 당신은 바로 여기, 또 다른 MVC 상호 작용을 봅니다 항상 다른 MVC를 뷰의 일부로 취급하므로 항상 MVC를 뷰로 간주합니다

아래에있는 세 개의 MVC는이 MVC 뷰의 일부입니다 따라서 다음 세 개의 MVC는이 MVC의 뷰입니다 따라서 그들은 맹목적이고 구조화 된 방식으로 그들과 이야기해야하므로 표준화되고 익명으로 의사 소통해야합니다 일반적인 재사용 가능한 구성 요소와 같은 이러한 종류의 동작은 일반적이고 재사용 가능한 구성 요소와 같습니다 그리고 우리는 이것이 어떻게 작동하는지 볼 때 어떻게 작동하는지 보게 될 것입니다

월요일부터 일주일에 여러 MVC 응용 프로그램에 대해 이야기하기 시작합니다 월요일 이후 일주일 후, 여러 MVC 프로그램에 대해 이야기 할 것입니다 이제 우리가 여기서하고자하는 주요 사항은 우리 토론의 주된 목적은 당신이 글을 쓰지 않는다는 것입니다 이와 같은 여러 MVC 응용 프로그램, 여기에는 여러 개의 MVC가있는 프로그램이 있습니다 화살표는 도처에 나와 있습니다

우리가 이것을 원하지 않는 이유는 녹색 화살표가 어디 에나 있습니다 우리가 원하지 않는 이유는 디버깅 및 진행 상황을 파악하는 것은 불가능합니다 디버깅하거나 문제가있는 곳을 찾을 수 없습니다 UI에서 뭔가가 변경되면 프로그램에서 UI가 변경되면 앱에서 어떤 컨트롤러가 어떤 컨트롤러를 사용하는지 알지 못하거나 어떤 컨트롤러가 작동하는지 알지 못합니다 어떤 모델이 데이터를 제공했는지, 우리는 완전히 잃어 버렸습니다

우리는 단서가 없을 것이다 그들을이 멋진 MVC에 그룹핑하여 각 스크린에 전화를 걸기 때문에, 그것들을 매우 훌륭한 MVC, 각 전화의 인터페이스 이해하기 쉽고 이해하기 쉽고, 디버그 가능하며, 고립되어 있고, 이해하기 쉽고 디버그하기 쉽습니다 관리가 가능합니다 모두가 모든 것을 갖추고 있습니까? 모두들 분명해? 그래서 우리는 이런 방식으로 일하지 않을 것입니다 이것은 의사 소통하는 첫 번째 방법은 아니지만 이것을하지 마십시오 좋아, 내가 할 수있는 데모 야

그래서 내가 보여주고 싶은 건 우리는 집중 게임을 할 것입니다 그러면 우리는 플럽 게임을 완성 할 것입니다 모델을 만들려고하고 모델을 만든 다음 모델을 모델에 넣을 것입니다 길을 따라 우리는이 모든 것을 배울 것입니다 동시에 우리는 다른 지식 포인트를 배우게 될 것입니다

다시 말하지만,이 슬라이드는 데모를 마친 후에 보게되는 슬라이드입니다이 슬라이드는 나중에 볼 수 있습니다 물론 이것들을 배우고, 이것들을 배웠는지 확인하는 데 사용됩니다 나는 다시 슬라이드로 돌아 가지 않을 것이다 다시 한번, 나는 슬라이드로 돌아 가지 않을 것이다

그런 다음 금요일 방학이 11:30에 있다는 것을 잊지 말고 11:30에있는 금요일 섹션을 잊지 마세요 금요일 Xcode와 디버깅에 대해, 다음 주 금요일에 Xcode와 디버깅에 대해, 다음주에 우리는 스위프트 (Swift)와 다른 아이폰 OS에 대해 이야기 할 것이고, 우리는 스위프트 (Swift)와 다른 아이폰 OS 콘텐츠에 대해 이야기 할 것이다 우리 모두가 집중 게임으로 모든 것을 할 것입니다 우리의 데모 랜드와 조금 비슷합니다 데모 장소로 사용하십시오

내가 보여 줄께, 무언가에 대해 이야기하고, 슬라이드를 몇 가지 설명하고, 몇 가지 슬라이드를 보여줄 것입니다 그리고 나서 우리는 집중으로 갈 것입니다 그러면 우리는 플럽 게임에갑니다 실제로 어떻게 보이는지 보여 드리겠습니다 좋아요, 여기 있습니다

실제로 무엇인지 보여 드리겠습니다 자, Xcode로 가자 우리가 월요일이 끝날 때의 정확한 위치로 되돌아갑니다 월요일에 수업을 듣던 곳으로 돌아 왔습니다 우리는 가지고있다

우리의 뷰 컨트롤러는 여기 있습니다 우리는 모두 준비가되어 있습니다 뷰 컨트롤러, 우리는 이미 사용하고 있습니다 MVC의 바로 지금,이 이야기 게시판에 V, MVC가 있습니다 여기서 스토리 보드는 V (iew) 우리의 견해, 바로 여기, 우리의 C 관제사입니다

좋아, 우리의 견해 다음은 C (ontroller) 컨트롤러입니다 이것이 우리의 관제사이며, 이것이 우리의 견해입니다 그래서 이것이 우리의 관제사입니다 이것이 우리의 견해입니다

우리는 M이 필요합니다 그래서 M을 만들자 그래서 M (odel)이 필요하다 이제이 모델을 만들어 보자 Xcode에서 새로운 클래스 또는 기타 클래스를 만드는 방법 Xcode에서 새로운 클래스를 만드는 방법은 무엇입니까? 우리는 file> new> file로 간다

그래서 우리의 새로운 메뉴 바 File> New> File 을 만드는 방법이다 신속한 파일, 또는 무엇이든, 그렇게 할 때 새로운 Swift 파일과 비슷한 방법을 만듭니다

그것을 클릭하면 원하는 다양한 iOS 파일을 제공하고 iOS에 대해 다양한 종류의 파일을 제공 할 수 있습니다 그러나 실제로 이것은 가장 흥미로운 두 가지입니다 그러나 우리는이 두 가지 것에 대해 가장 염려합니다 이것은 하위 클래스를 만들고 싶다면 하위 클래스를 만들고 싶을 때입니다 iOS의 Cocoa Touch 클래스에서 상속받은 클래스의 하위 클래스와 같은 iOS 클래스의 Coco Touch 클래스 다른 뷰 컨트롤러 또는 비슷한

예를 들어, UIViewController 상속하는 하위 클래스 만들기 하지만 여기서는 모델이 아닌 UI에 대해 이야기하고 있습니다하지만 지금은 모델링 할 것입니다 UI와는 아무런 관련이 없습니다 빈, 완전히 빈 Swift 파일을 고를 것입니다 빈, 완전히 비어있는 Swift 파일을 선택합니다

이것은 이름을 묻습니다 우리는 항상 여기에 파일의 이름을 묻는 파일의 이름을 지정합니다 우리는 항상 파일을 저장합니다 Swift에서 생성합니다 가장 많이 생성 된 Swift 파일을 기반으로 이름을 지정합니다

그 파일에있을 중요한 수업입니다 이제 파일에서 가장 중요한 클래스 이름을 사용할 것입니다 그럼 내가 원해 내 모델, 내 주요 모델 클래스, 집중력, 내 모델 호출, 주 모델 클래스 농도라는 게임을 구현하는 것이기 때문에 농도, 그래서 이름 농도를받을 자격이, 그래서 엎질러 야, 그래서 그것은 게임의 이름을 따라야한다 영어 이름 농도 그게 내가 부르는거야 그런데, 내가 안 할거야

내가 준 이름이야 그건 그렇고, 나는하지 않을거야 그것을 넣어, 당신은이 그룹을보고, 이것은 최상위 프로젝트입니다, 그것을 넣어, 당신은 그룹, 지금은 프로젝트의 최상위 수준을 참조하십시오 한 레벨 아래의 폴더에 넣고 싶습니다 다음 레벨 폴더에 넣어야합니다 그것은 당신의보기 컨트롤러와 동일한 폴더와 당신의보기 컨트롤러가 같은 폴더에있어

최상위 수준보다 넣는 것이 더 좋습니다 최상위 수준에 넣으면 작동하지만 상단에는 정상입니다 좋아,하지만 이걸로 더 잘 어울릴거야 좋은 나는이 스위프트 파일을 만들거야, 우리를 위해 그것을 만든다이 스위프트 파일을 만들기 위해 Create를 클릭하면, Xcode가 생성되었다

전체 화면으로 만들려면 여기에 전체 화면을 넣으라고 말하십시오 여기서 유일한 코드는 Foundation 가져 오기 UI 키트 가져 오기가 아닙니다이 파일은 UI 파일이 아니며, UI와 관련이없는 파일이기 때문에 UIKit 대신 Foundation Foundation을 가져옵니다 이것은 완전히 UI 독립적 인 모델입니다이 모델은 UI에 묶여 있지 않습니다

그래서 나는 여기서 수업을 할거야 여기서 수업을 정의하고 싶어 집중력이라고 부르 겠어 집중력 집중력이라고 부르고 싶다

좋아, 내 수업이 있는데, 내가 새로운 수업을 만들면, 좋아,이 수업이 내 수업이다 새 수업을 정의 할 때마다 항상 공개 API가 무엇인지 생각하고 싶습니다 공개 API, 공용 애플리케이션 인터페이스 얼마나 많은 사람들이 API 문구가 무엇인지 알고 있습니까? API가 무엇을 의미하는지 얼마나 많은 사람들이 알고 있습니까? 글쎄, 거의 아무도, 알았어 그래서, API는 기본적으로 아무도 모른다 따라서 API는 응용 프로그래밍 인터페이스 (Application Programing Interface) : 응용 프로그래밍 인터페이스의 목록 일뿐입니다

해당 클래스의 모든 메소드 및 인스턴스 변수와이 클래스의 모든 메소드 및 인스턴스 변수 목록 공개 API는 모두 인스턴스 변수 및 메소드이며, 공용 애플리케이션 인터페이스는 모두 인스턴스 변수 및 메소드입니다 다른 클래스가 호출 할 수 있도록 허용하므로 다른 클래스가 액세스 할 수 있도록 허용하는 부분입니다 그래서 기본적으로이 수업을 어떻게 사용하는지, 다음 주에 우리는 기본적으로이 수업을 어떻게 사용할 수 있는지, 다음 주에는 실제로 사설을 비공개로 만드는 방법에 대해 이야기하고 이러한 인터페이스를 개인 (비공개)으로 만드는 방법에 대해 이야기 할 것입니다 공개하지만 오늘은 걱정하지 않겠지 만 공개는하지만 걱정하지 않아도됩니다 기본적으로 내 공개 API를 디자인하겠습니다

하지만 먼저 공용 애플리케이션 인터페이스를 디자인 할 것입니다 왜 지금, 내가 어떤 종류의 제 vars와 funcs를 바로 디자인하면, 왜 처음부터 변수와 메소드를 디자인해야합니까? 여기 박쥐, 그리고 그 이유는 API를 디자인 할 수있는 이유가 있기 때문입니다 이 물건이하는 일의 본질을 이해하고이 일이 자연에서 무엇을 할 수 있는지 이해합니다 사람들이 그것을 어떻게 사용하고 사람들이 그것을 어떻게 사용하는지 이쪽으로 디자인을 할 때 명확하게 생각할 수있게 설계되었습니다

따라서 나는 이렇게하는 것이 좋습니다 당신이 디자인 한 모든 수업 집중 게임입니다 이것은 모든 수업을 설계 할 때의 경우입니다 플럽 게임을위한 것 여기서 우리가 그것을 가지고 있다는 것을 기억하십시오? 그것의 본질은 무엇입니까? 이것이 우리가 여기있는 것입니까, 그 본질은 무엇입니까? 글쎄요, 카드 하나가 필요합니다

그 카드는 가장 기본적인 카드입니다 그 카드는 카드 배열 또는 무언가이며, 그 카드는 일련의 카드로 나타낼 수 있습니다 카드의 배열과 같은 것이 확실합니다 그래서 확실하지 않습니다 카드 배열과 같은 것입니다

그것이 집중 게임의 근본적인 부분입니다 플럽 게임의 기초입니다 물론, 집중 게임에서 무엇을 할 수 있습니까? 그렇다면 플럽 게임에서 무엇을 할 수 있습니까? 사용자가 할 수있는 유일한 방법은 플레이어가 할 수있는 유일한 방법 중 하나입니다 카드를 뒤집어서, 오른쪽으로, 카드를 선택하십시오 카드를 뒤집은 것이 전부입니까? 뒤집을 카드를 선택하십시오

정말로 카드를 선택할 수 있습니다 모두 일치하고 할 수있는 모든 것은 플럽입니다 페어링 이러한 모든 것들은 내부 구현의 일종이며 내부 구현입니다 집중 게임 : 사용자의 관점에서 볼 때 플럽 게임은 자체적으로 처리됩니다 플레이어의 경우 너 그냥 그걸 만지고있어

그래서 나는 카드를 주문하기 만하면된다 그래서 나는 방법이 필요해 그게 내가 카드 하나를 고르도록하자 좋아, 내가 카드를 선택하게 해줘 이것에 대한 논쟁은 카드 일 수도 있고,이 방법의 주장이 무엇이든간에, 카드, 이 것은 우리가 잠시 후에 정의 할 것이지만이 클래스의 인스턴스 Card 나중에 정의 할 클래스 실제로 좀 더 유연하게 만들 겠지만 사실 더 유연하게 만듭니다

이 배열의 색인으로 만들거야이 배열의이 카드 색인을 받아 들일 때 카드를 선택하십시오, 나는 당신을 인덱스로 선택하게 할 것입니다 그래서 당신이 카드를 선택할 때, 나는 당신이 그것의 인덱스를 선택할 수있게 할 것입니다 그리고 그것은 다른 것보다 조금 더 융통성있게 될 것입니다

이 일을 원할 수도있는 UI의 종류이 기능을 구현하는 사용자 인터페이스 그것들은 인덱스를 기반으로 할 수도 있습니다 실제로 그렇게 큰 것은 아닙니다 이러한 UI는 인덱스 기반 일 수 있습니다 이것은 실제로 거의 영향을 미치지 않습니다

당신은 언제나 인덱스를 들여다 볼 수 있기 때문에 항상 인덱스를 찾을 수 있습니다 항상 배열입니다 그러나 배열을 첨자로 쓰는 것이 조금 쉽지만이 배열을 첨자로 사용하여 배열 요소에 액세스합니다 다른 방법으로 찾으려면 배열에서 요소를 찾는 것보다 쉽습니다 지난 번에했던 것처럼 인덱스를 작성하십시오

실제로는 그것이 마지막 인덱스 (of :)를 사용하는 것보다 쉽습니다 좋아, 이제 끝났다 이것이 전부입니다이 API는 전체 공용 API입니다이 모든 것이 애플리케이션 인터페이스를 노출합니다

나의 집중 게임 중 더 간단 할 수는 없어 내 플럽 게임은 이것처럼, 더 이상 간단하지 않다 이제는 카드를 정의해야합니다하지만 이제는 카드를 나타내는 클래스 인 Card를 정의해야합니다 우리는 파일> 새 파일> 가서 다른 스위프트 파일을 만들려고합니다

우리는 여전히 파일> 새로 만들기> 파일 다른 스위프트 파일을 만듭니다 이건 내가 카드라고 부를거야 좋아, 이걸 카드라고 부른다

그것을 다른 곳에있는 것과 같은 곳에 두십시오 좋아요, 다시 한번 말하지만 UI와 관련이 없습니다 이 모델은 내 모델의 일부이므로 내 모델에는 두 가지가 있으며 이는 또한 내 모델의 일부입니다 그래서 내 모델은 두 부분으로 구성되어 있습니다 집중 게임과이 카드는 실제로 플럽 게임이고, 하나는 카드입니다

여기서 흥미로운 것은 카드를 구조체로 만들려고합니다 struct 키워드로 카드를 정의하고 싶습니다 클래스가 아니라 클래스의 차이점은 무엇입니까? 그 차이점은 무엇입니까? Let 's go ahead와 struct와 class의 차이점은 무엇입니까? 우리를 보자 같은 시간에 집중력을 높이세요 내 수동 작업을 여기에서 사용할 수 있습니다

왼쪽에 카드가 있으며 수동으로 수동으로 선택할 수 있습니다 우리 카드가 왼쪽에 있어요 오른쪽 구조, 하나는 클래스, 하나는 구조체, 이제는 집중력이 오른쪽에 있습니다 오른쪽에는 클래스가 있고, 왼쪽에는 struct C와 같은 많은 다른 언어에서 struct는 C, struct 약간의 데이터를 보유하고있는이 작은 것 그다지 큰 거래는 아니지만 스위프트에서는 중요한 것이 아닙니다

그러나 스위프트 구조체와 클래스는 거의 똑같습니다 구조체와 클래스는 기본적으로 동일합니다 그들은 메소드를 가지고 있고, 그것들은 매우 비슷합니다 그래서 그들은 모두 메소드, 변수, 매우 유사한 것을 가지고 있습니다 두 사람의 차이점은 무엇입니까? 두 사람의 차이점은 무엇입니까? 두 가지 큰 차이점이 있습니다

미성년자가 있습니다 두 가지 주요 차이점이 있습니다 일부 작은 우리는 이걸 살펴볼 때 차이점을 보게 될 것이지만 그 차이점은 나중에 다룰 것입니다 구조체와 클래스에는 두 가지 주요한 차이점이 있지만 구조와 클래스의 두 가지 주요 차이점 이것을 이해하는 것이 매우 중요합니다 이것을 이해하는 것이 매우 중요합니다

첫째, 구조체, 상속 없음 첫째, 구조체에는 상속이 없습니다 따라서 구조체를 상속 할 수 없도록 구조체를 만드는 구조체에는 상속이 없습니다 이것은 구조를 만든다 조금 더 간단합니다

상속을 받으면 조금 더 간단합니다 왜냐하면 상속이 있다면 상속받는 모든 것에 대해 걱정할 필요가 있으며 상속 된 것을 고려해야합니다 구조체에는 상속이 없습니다 당신에게 어떤 의미인지 생각해보십시오 구조에는 상속이 없습니다

따라서 클래스보다 조금 더 간단합니다 두 번째로 클래스보다 약간 간단합니다 둘째 가장 중요한 차이점은 struct가 값이 가장 중요한 차이이며 구조가 값 유형이라는 것입니다 유형 및 클래스는 참조 유형이며 클래스는 참조 유형입니다 그게 무슨 뜻 이죠? 가치 유형, 그게 무슨 뜻 이죠? 값 유형 인수로 전달할 때 배열에 넣고 함수에 매개 변수로 전달하면 배열에 넣을 수 있습니다

심지어 다른 변수에 할당하면 복사됩니다 다른 변수에 할당하더라도 복사됩니다 이해하는 것이 매우 중요합니다 놀라운 사실입니다 이것을 이해하는 것이 매우 중요합니다

복사됩니다 그리고 당신이 이것을 이해하는 것이 왜 그렇게 중요합니까? 왜 이것이 매우 중요하다는 것을 이해합니까? 왜 구조체를 피하지 않으 시렵니까? 구조체를 사용하지 않으시겠습니까? 왜냐하면 당신은 iOS에서 구조체를 피할 수 없기 때문입니다 iOS를 개발했기 때문에 구조체를 피할 수는 없습니다 배열은 구조체이며, int는 구조체이며, 문자열은 구조체이고, 배열은 구조체이며, 정수는 structs이며, 문자열은 structs입니다 사전은 구조체이며, 이것들은 모두 구조체입니다

사전은 구조체입니다 구조체입니다 코드에서 전달할 때 코드간에 전달할 때 그들은 최근에 복사되고 있습니다 그들은 항상 복사됩니다 이제 너는 어쩌면 같을 수도 있고, 잠깐 기다려도된다

그러면 생각할지도 모른다 그것은 매우 비효율적 일 것입니다 스위프트는 매우 비효율적 일 것이기 때문에 아닙니다 스위프트 때문이 아니라 이러한 것들을 통과 할 때 초능력이 똑똑한가요? 모든 것의 모든 비트를 복사하지는 않으며 모든 비트를 복사하지는 않습니다 전달할 때 배열

배열을 전달할 때 발생하지 않도록 전달합니다 전달 방법은 다음과 같습니다 누군가가 실제로 복사 할 필요가있을 때만 사본, 실제 사본을 만들어야합니다 이를 복사시의 (copy-on-write) 의미론이라고 부르며 복사 할 값을 수정했습니다 이것을 "copy-on-write"라고합니다

이것이 Swift가 이러한 값 유형을 구현하는 방법입니다 Swift가 이러한 값 유형을 구현하는 방법입니다 그래서 구조체는 값 형식입니다 클래스는 참조 형식이므로 구조체는 값 형식이고, 클래스는 참조 형식입니다 참조 유형이란 무엇입니까? 그렇다면 참조 유형이란 무엇입니까? 그게 다른 언어로 익숙해 져서 다른 언어로 익숙한 것입니다

그 물건은 힙에있다 당신은 그것에 대한 포인터를 가지고있다 힙에 저장 될 때, 당신은 포인터를 그 포인터에 둔다 당신은 그것을 주변을 지나치고 주변을 지나치지 않습니다 통과하면 주변을 지나치지 않을 것입니다

포인터를 전달하는 것입니다 포인터를 전달합니다 그리고 많은 코드를 가지고 있으므로 많은 코드가있을 수 있습니다 동일한 객체에 대한 포인터를 가지고 있으므로 객체에 대한 포인터를가집니다 거기에 차이가 있습니까? 차이점을 보시겠습니까? 구조체에 익숙해 지려면 시간이 걸리기 때문에 구조체에 익숙해 져야합니다

너는 네가 지나칠 때 익숙하지 않아 네가 여전히 익숙하지 않아 네가 지나갈 때 너는 익숙하지 않아 복사본을 만들지 만이 메커니즘을 복사 할 것입니다 그러나 너는 볼 것이다 이것은 훌륭한 메커니즘을 제공 할 수 있다는 놀라운 의미를 제공합니다 당신의 이익을 위해 사용하십시오

우리는 여기까지 볼 것입니다 우리는 여기서도 볼 수 있습니다 이 예에서는 약간의 방법으로이 프로그램을 시작할 것입니다 하지만 복사하면 분명히 배열과 사전을 사용하기 시작할 때 그것을보고 배열과 사전을 언제 사용하는지보십시오 좋아요, 구조체, 여기에 카드를 넣거나 비슷한 것을 사용할 때 말이죠 좋아, 카드 구조 카드에는 무엇이 필요합니까? 마찬가지로, 본질에 대해 생각해 봅시다

마찬가지로, 본질이 무엇인지 생각해 봅시다 물론 카드는 앞면이 보이지 않을 수도 있으므로 카드가 앞면이 보이는지 기록해야합니다 아마도 항상 얼굴을 아래로 내밀기 시작합니다 말하자면, 우리는 얼굴을 아래로 내리기로 결정했습니다 카드가 매치 될 수 있는지 아닌지, 아마 카드가 매치되거나 매치되지 않을지 모른다는 것을 분명히 밝혀 낼 것이다

아마도 우리는 명시 적으로 타의 추종을 불허합니다 카드에 고유 한 신원이 필요하다는 것을 알고 계실 것입니다 카드에는 고유 한 신원이 필요하다는 것도 알고 있습니다 우리는 일치하는 게임을하고 있고 일치하는 게임을하고 있기 때문에 할 수 없다면 할 수 없다면 카드의 신원을 말하면 카드의 신원을 구별하기 위해 카드를 대조 할 수 없으며 카드를 만들 수 없습니다 다른 카드예요 그래서 어떤 종류의 식별자 나 다른 카드가 필요합니다 그래서 우리는 식별자가 필요합니다

뭔가 실제로 어떤 유형이든 될 수 있습니다이 같은 것은 모든 유형이 될 수 있습니다 그것은 문자열 일 수도 있고, 뭐든지 될 수도 있습니다 나는 그것을 문자열이나 다른 것으로 만들 수 있습니다 나는하겠다

Int는 고유 한 Int를 만드는 것이 정말 쉽기 때문에 Int를 사용하면 고유 한 Int를 만드는 것이 매우 간단합니다 그래서, 우리는 확실히 그것을 필요로합니다 어떤 사람들은 생각할 수도 있습니다 오, 생각하는 사람들이있을 수 있습니다

카드에 이모티콘이 필요합니다 카드에는 이모티콘이 필요합니다 호박이나 유령처럼, 그리고 매우 중요하게는 호박이나 유령처럼 매우 중요하다 아니요,이 카드는 UI에 독립적입니다

카드가 UI와 관련이 없기 때문에 따라서 이모티콘이나 JPEG 이미지를 가질 수있는 방법이 없기 때문에 이모티콘이나 JPEG 그림을 사용하는 것이 불가능합니다 그런 것, 그게 당신이 카드를 어떻게 보여줄 수 있느냐입니다 다른 비슷한 것들, 당신이이 카드를 어떻게 보여줄까요? 이것은 카드가 어떻게 행동하는지, 게임이 어떻게 작동하는지에 대한 것입니다 따라서이 카드가 어떻게 작동하는지,이 게임은 어떻게 작동합니까? 이 모델에서는 이모티콘을 절대로 사용하지 않으므로이 모델에는 이모티콘 변수가 절대 존재하지 않습니다 여기 모델은 UI가 아니라 이해하는 것이 중요합니다

우리는 모델이 아니라 UI에 있습니다 이것은 당신이 이해해야 할 매우 중요한 것입니다 좋습니다 이제 기본적으로 모든 API와 Ok가 있습니다 이제는 기본적으로 모든 API를 얻습니다

우리의 모델은 여기에 있습니다 이러한 오류를 제거해 봅시다 몇 가지 오류를 제거합시다 우리는 여전히이 오류 클래스 집중도가 있습니다 우리는 여전히이 오류가 있음을 알지 못합니다

집중 클래스 아니요 이니셜 라이저, 우리가 익숙한 매우 일반적인 오류, 생성자, 매우 일반적인 실수 이것은이 var가 초기화되지 않았기 때문입니다 왜냐하면이 var가 아직 초기화되지 않았기 때문입니다 어떻게 카드 배열을 만들 수 있습니까? 카드 배열을 어떻게 만들 수 있습니까? 이제는 인스턴스를 만드는 법을 배우는 중입니다 이제 구조를 생성하는 방법을 배울 것입니다 구조체 또는 클래스의 경우 동일합니다

그들은 정확히 같다 그리고 우리가하는 방식은 그냥 평등을 말할 것입니다 우리가해야 할 일은 단지 등호를 붙이는 것입니다 열린 괄호, 닫는 괄호, 왼쪽 괄호, 오른쪽 괄호 이것은 단지 형식 일 뿐이며 int 또는 string 일 수 있습니다 하지만 그것은 Int 또는 String입니다

그것은 일련의 카드 일 것입니다 그리고 저는 여기에 퍼팅을하고 있습니다 그리고 나는 뒤에있다 괄호를 열고 괄호를 닫은 다음 왼쪽 및 오른쪽 괄호를 추가했습니다 저는 실제로 여기에 다양한 주장을 할 수 있습니다

그리고 다양한 매개 변수를 넣을 수도 있습니다 이것들은 내가 여러분에게 말하고있는 것들과 일치합니다 그들은 전에 여러분에게 말했던 init 함수와 관련이 있습니다 지난 번 기억해, 내가 마지막으로 수업 시간을 기억할 수 있다고 말했어 이니셜 라이저는 init이라는 특수한 메소드로, init이라는 특별한 메소드 인 생성자입니다

원하는 인수를 가질 수 있으며 원하는 매개 변수를 가질 수 있습니다 배열에는 init이 있습니다 많은 init 메소드를 가질 수도 있습니다 배열에 init 메소드가있다 아무 인자도 없으며 빈 배열을 만듭니다

인수가 없으며 빈 배열을 만드는 역할을합니다 배열이 존재하지만 카드가 없습니다 배열이 존재하지만 카드가 없습니다 그 안에는 아무것도 없어요 다른 것도 있고, 안에는 아무것도 볼 수 없어요

다른 초기화 메소드가 있습니다 이 문서에서 배열이 가지고있는 다른 것들에 대해서 문서, 배열의 init 메소드를 보라 예를 들어, 용량을 예약 할 수있는 init 메소드가 있습니다 특정 성능상의 이유로 성능상의 이유는 성능상의 이유로 인한 것입니다

배열이 얼마나 큰지 알 수 있습니다 배열이 얼마나 큰지 확실합니다 다른 배열에서 배열을 만들 수 있으며 다른 배열에서 배열을 만들 수 있습니다 그것은 다른 배열의 항목을 복사합니다 배열의 항목을 복사합니다 따라서 다른 inits가 있지만 가장 일반적인 배열 init이므로 다른 init 메소드가 있지만 가장 일반적입니다

이 일은 당신이 아무것도하지 않는 곳인가요? 이것은, 당신은 아무것도 할 필요가 없습니다 이제 그런 식으로 쉽게 사용할 수 있습니다 그런데 문법을 만들기 위해이 작업을 수행 할 것입니다 구문을 이해할 수 있지만 이해하기 쉽도록 거의 확실히 사용 하겠지만 대부분의 경우이 구문을 사용합니다 이 문법 카드의 배열 지난 번에 내가 보여 줬던이 문법

카드 배열 지난 번에 보여 줬어 그래서 나는 빈 카드 배열을 가지고 여기에서 작업 할 수 있습니다 그래서 나는 빈 배열이 작동하도록했습니다 나는 아무런 경고도하지 않았다

그래서 지금, 경고 할 시간이 아니다 그래서 지금은 시간이다 컨트롤러로 돌아가서이 모델을 사용해보십시오 컨트롤러로 돌아가서이 모델을 사용해보십시오 우리는 MVC를 컨트롤러로 되돌려 놓고 있습니다

그래서 우리는 MVC 디자인 패턴을 사용하고 있으며 이제 컨트롤러로 돌아갑니다 나는 여기로 돌아갈거야, 나는 내 ViewController에 갈거야 그래서 나는 여기로 돌아 가야 해, 나는 내 ViewController에 갈거야 동시에 집중력을 갖자 집중도 파일도 여기에 두자

사실, 이제 시작하겠습니다 우리는 농도가있어, 농도 파일을 가지고있어 나는 그것을 작게 만들 것입니다, 거기 있습니다, 그리고 ViewController, 저는이 방법으로, 뷰 컨트롤러에서 좀 더 좁혔습니다 그러면 컨트롤러에서 내 모델을 어떻게 사용합니까?이 컨트롤러에서 모델을 사용하려면 어떻게해야합니까? 내가하고 싶은 첫 번째 일은 큰 녹색 화살을 만드는 것입니다 제가하고 싶은 첫 번째 일은이 녹색 채널을 만드는 것입니다

내 컨트롤러에서 내 컨트롤러를 가리키는 녹색 화살표 모델을 만들고 var 모델을 만들어서 할 것입니다 그래서 저는 var를 생성하여 이것을 할 것입니다 내 컨트롤러에서 그것을 게임이라 부르면 내 컨트롤러에서 작동하게되고 게임이라고 부릅니다 그 다음 유형은입니다 집중력 : 큰 녹색 화살표가 있습니다

농도를 보낼 수 있습니다 이게 내 초록색 채널이야 보낼 수있어 내가 원하는 모든 메시지는 같은, 나는 그것의 카드를 얻을 수 있습니다 게임 내가 게임 할 소식은, 예를 들어, 내가 카드 (카드 배열) 얻을 수 있습니다 나는 카드를 선택할 수 있으며, 무엇이든 할 준비가되었습니다

카드를 선택할 수 있습니다 계속할 수 있습니다 이제 내가 얻은 오류를보고, 우리가 가장 좋아하는 오류, 내가 가진 오류, 우리가 제일 좋아하는 오류에주의를 기울이십시오 이 ViewController 클래스에는 생성자가 없으므로 ViewController 클래스에는 이니셜 라이저가 없습니다 초기화되지 않았습니다

어떻게 초기화할까요? 초기화 어떻게 초기화할까요? 보자 우리는 우리가 보았던 것과 비슷한 것을하고 싶다이 배열을 다루는 것과 비슷한 것을해야한다 이 배열을 여기 위에 올려 놓았습니까? 그렇게 해보 죠

해보자,하자 집중력, 이건 효과가 없을거야, 맞지? 집중력을 써라, 이건 제대로 작동하지 않을거야, 그렇지? 왜냐하면 우리는 집중을위한 인수없이 init 메소드를 생성하지 않았기 때문에 인수가없는 init을 생성하지 않았기 때문입니다 농도하지만 효과가 있었지만 성공했습니다! 이것이 어떻게 작동 할 수 있습니까? 대답은 수업입니다 어떻게 작동 할 수 있습니까? 대답은 수업입니다 그리고 농도는 클래스이며, 아무 것도없는 자유로운 초기화를 얻습니다

농도는 매개 변수없이 자동으로 매개 변수를 가져 오는 클래스입니다 모든 변수가 초기화되는 한 인수 모든 변수가 초기화되는 한 생성자 그리고 이것은 하나의 변수만을 가지고 있습니다 초기화됩니다

그래서 하나의 변수를 가지며 이미 초기화되었습니다 농도가 초기화되어 있습니다 초기화되었습니다 농도가 자동으로 init 메소드를가집니다 우리는 그것을 초기화했다

우리는 실제로이 유형이 필요하지 않습니다 왜 기억합니까? 실제로이 유형은 필요하지 않습니다 이유를 기억하십시오 타입 추론, 분명히 Swift는이 타입의 추론에서 알아낼 수 있습니다 분명히 Swift는이 코드 라인과 구별 할 수 있습니다

코드 라인은 게임 유형이 집중력, 게임이 아닙니다 집중 유형, 우리는 거기에 넣을 필요가 있습니다하지만 재미 있고 좋았습니다 여기에 넣을 필요가 없습니다 그러나 재미 있고 아름다운 이 무료 초기자를 얻었지만 실제로는 좋지 않습니다

우리는이 기본 생성자를 얻었지만 실제로는 우아하지 않습니다 그것은 충분하지 않습니다 왜냐하면 우리가 집중력을 창조 할 때 그것은 충분히 우아하지 않습니다 왜냐하면 우리가 플럽을 만들 때 게임, 우리는 얼마나 많은 카드가 있는지 생각해야합니다 게임 때문에, 얼마나 많은 카드가 게임에 있는지 생각할 것입니다

왜냐하면 집중 게임은이 배열을 일종의로드해야합니다 여기에 사용할 모든 카드와 함께 모든 카드 배열을 가지고 사용하십시오 그리고 집중 게임에만 12가 있다고 가정 할 수 없습니다 우리는 플랍 게임에 12 개의 카드 만 있다고 가정 할 수 없습니다 우리가 보드에 가지고있는 것과 같은 카드 또는 우리가 패널에서하는 것처럼 네 장의 카드 만 있습니다

또는 카드 4 장만 현재 UI와 마찬가지로 현재 UI와 같은 것을 만들어야합니다 우리는 실제로 하나를 만들어야합니다 자신의 init 그래서 우리의 init 메소드보다 더 많은 공간을 만들자 시작합시다

다시 한 번, 여기에 공간을 놓으십시오 여기에 집중력 클래스에 init을 추가하십시오 그런 다음, Concentration 클래스에 init 메소드를 추가하십시오 Init 이제 다시 우리는 원하는 인자를 갖게됩니다

이제 우리가 원하는 매개 변수를 가져와야합니다 우리가 게임을 만드는 데 필요한 것은 우리가 알아야 할 것입니다 카드 쌍의 수입니다 그리고 그것은 Int가 될 것입니다 그것은 Int가 될 것입니다

그래서 사람들이 그렇게 할 이니셜 라이저는 사람들이 플럽 게임을 만드는 데 사용할 것입니다 집중 게임을 만드는 데 사용해야합니다 사촌이 필요합니다 그래서 우리는이 초기화를 어떻게 구현할 것인가? 그러면이 생성자를 어떻게 구현할 수 있습니까? 우리는이 많은 카드 쌍을 만들어야하고 카드 쌍 수를 저장하는 속성을 만들어야합니다 여기에 넣으십시오

한 장의 카드를 만들어 보자 카드를 만들어 봅시다 카드 =, 어쩌면 우리는 운이 좋게 될 것이고 카드는 =, 아마 우리는 운이 좋다, 우리는 직접 할 수있다 우리는 카드를 말할 수 있습니다 우리는 카드를 쓰기 위해 일했습니다

그것을 쓰고, 그것을 써서 집중 시켜라 집중력, 작동하지 않아 왜 작동하지 않았 니? 성공하지 못했습니다 왜 이래? 왜냐면 우리 카드에 여기를 들여다 보면이 장소에서 카드 파일을 보면 카드 씨를 불러 오십시오 카드, 카드 가져 가자 여기에는 초기화되어야 할 것이 있습니다

아직 초기화되지 않은 무언가가 있습니다 카드는 구조체입니다 구조체는 무료 초기화기를 갖습니다 카드는 구조체이며 구조체에는 자동으로 생성 된 생성자가 있습니다 뿐만 아니라 수업과는 다르지만 수업과는 다릅니다

이것은 구조체와 클래스의 또 다른 차이입니다 이것은 구조체와 클래스의 또 다른 차이점입니다 구조체, 그들이 얻는 무료 이니셜 라이저는 초기화 된 모든 구조체를 자동으로 생성자 생성자에 의해 초기화됩니다 이미 초기화 된 경우에도 변수는 이미 기본값이 있어도 모든 변수를 초기화합니다 isFaceUp과 isMatched와 같습니다

이걸보세요, isFaceUp과 isMatched 같은 것 이거 봐, 알았지? 카드 만 입력하면됩니다 괄호를여십시오 쓰러 뜨릴 것입니다 카드, 왼쪽 괄호 Xcode에서 이니셜 라이저를 보여 주도록하겠습니다

Xcode에서 생성자를 보여 주도록하겠습니다 모든 단일 변수를 초기화한다는 것을 알 수 있습니다 모든 변수가 초기화된다는 것을 알 수 있습니다 그래서 isFaceUp false, isMatch false, false로 isFaceUp을 쓸 수 있습니다 false에 매치됩니다

식별자, 나는 내가 만들어야 할 것 같아요 식별자에 관해서는, 내가 추가해야 할 것 같아요 이 일을하기위한 식별자이 일을하기위한 식별자 그래서 저는 카드를 초기화 할 수 있습니다 무료로 얻을 수 있습니다

카드 오브젝트를 초기화 할 수있는 이유는 그것을 가지고 있기 때문입니다 클래스는 이런 종류의 무료 초기자를 결코 얻지 못합니다 클래스에는이 생성자가 없습니다 그들은 모든 변수에 대해 초기화되지 않은 무료 초기자를 얻지 못합니다 모든 VAR을 초기화 할 수 있습니다

그것은 순수하게 구조체입니다 그러나 이것은 구조체와 정확히 일치하기 때문에 가짜입니다 하지만 단점이 있습니다 이것들은 false입니다 그래서 초기화합니다

왜냐하면 false로 시작하기 때문에 왜 초기화합니까? 그들이 다시 거짓말이라고해야합니까? 내가 제거하고 싶으면 다시 써야합니다 틀린가요? 이걸 없애고 싶으면 그것들을 없애기 위해서, 나는 여기에 이니셜 라이저가 있습니다 그래서 생성자 인 이니셜 라이저를 갖겠습니다 여기에 하나 추가 할 것입니다 단지 Int 식별자, 즉 Int 타입 매개 변수의 생성자 인 식별자를 취합니다

그리고 나서 여기에이 식별자를 설정하고 싶습니다 여기서 식별자를 여기에 설정하고 싶습니다 이 식별자는 여기에 있습니다 여기에이 식별자가 있습니다 우리는 이미 두 가지 문제가 있습니다

우리는이를 시도하고 있습니다 우리는 두 가지 문제를 겪었습니다 해결해야합니다 하나는 분명히 옳을 수 없다는 것입니다 식별자는 같습니다

이 질문은 틀린 것이어야합니다 식별자는 같음 식별자? 저것은 이상한 것입니다 한가지는 식별자를 알아 차리는 것입니까? 너무 이상합니다 주목할 사실은 두 가지 모두 내 이름에서 외부 이름을 사용하지 않았고 두 개의 init 메소드에서 매개 변수 레이블을 쓰지 않았습니다 내부 이름으로, 매개 변수 이름이 있습니다

당신은 알아 차 렸니? 나는 하나만했는데, 이는 외부 이름과 매개 변수 레이블 및 매개 변수 이름을 의미하는 이름을 썼음을 의미합니다 내부 이름이 동일하기 때문에 수정할 수있는 한 가지는 동일합니다 이를 해결하는 한 가지 방법은 즉, 내부 이름을 i와 같이 다르게합니다 매개 변수 이름을 다르게합시다 예를 들어 그리고 나서 identifier = i라고 말할 수 있습니다

이렇게하면 identifer = i라고 말할 수 있습니다 보시죠? 이것은 외부 이름입니다, 이해합니까? 매개 변수 레이블입니다 이 init을 호출 할 때 여기에서 사용하고 있습니다이 init 메서드를 호출하면 사용하고 있습니다 내부 이름은 여기에서 사용하고 있는데, 이것은 매개 변수 이름이며 메서드 내에서 사용합니다

그리고 이제이 식별자는 하나의 식별자라는 것을 알고 있습니다하지만 이제는이 식별자가 하나라는 것을 알고 있습니다 너도 알 잖아? 이건 좀 심해 우선, 너는 약간 거친 것을 알지 처음 나 같은 변수 이름을 싫어

내가 나쁜 변수 이름입니다 나는 같은 변수 이름을 싫어 나는 아주 나쁜 변수 이름이다 여기에 갖고 싶지는 않지만 실제로는 여기에 나타나기를 원하지 않는다고 생각하지는 않습니다 그러나 나는 정말로 그것을 생각할 수 없다

여기 다른 식별자 중 식별자보다 더 나은 이름입니다 식별자는 좋은 이름입니다 식별자는 여기에 충분한 이름입니다 그래서 실제로 같은 내부 이름을 원하고 매개 변수 레이블과 매개 변수 이름이되기를 원합니다 외부 이름

이제는 init이 일반적으로 소유하는 한 가지 방법이 있습니다 일반적으로 동일한 내부 이름과 외부 이름을가집니다 동일한 매개 변수 레이블과 매개 변수 이름을 갖는 대부분의 메서드 함수는 그렇지 않지만, 경향이 있습니다 그들은 꼭 할 필요는 없지만, 함수의 대부분은 그렇지 않습니다 만, init는 이와 같은 경향이 있습니다 그것들은 반드시 같을 필요는 없다

그러나 그들은 그렇게하는 경향이 있습니다 그래서, 지금 저는 이것을 말하려하지만, 그렇지만 그들은 이런 경향이 있습니다 그래서 이제 다시 돌아가서이 길을 다시 씁니다 그것은 아닙니다, 나는이 두 가지를 구분할 수는 없지만, 둘 다 말할 수는 없습니다 그렇다면이 둘을 어떻게 구별 할 수 있습니까? 차이점을 어떻게 설명 할 수 있습니까? 이것은 매개 변수입니다

이것은 내 자신에 대한 내 식별자입니다 이것은 실제 매개 변수이며, 이것은 내 식별자입니다 글쎄, 나는 말할 수있다, 자기 자아 내 식별자를 의미한다

그래서, 나는 자필을 쓸 수있다 자아 내 식별자를 의미한다 이 카드의 식별자입니다 이제이 카드의 식별자 인이 카드를 원합니다

이제 우리가 원하는 것이 무엇인지 압니다 그리고이 하나가 이것입니다 이것은 다소 차가 웠습니다 이것은 이것에 해당합니다 이것은 꽤 멋지다

우린 그 일이 끝났어 좋아, 그래서 우리는 계속할 수 있었다 확인 다시 여기로 다시 가자 다시 여기로 가자 우리는 훌륭한 카드 하나를 만들 수 있었고 좋은 결과를 얻었습니다

우리는 성공적으로 카드의 인스턴스를 만들 수있었습니다 하지만 카드의 식별자를 지정해야하므로 식별자를 명확히해야합니다 식별자가 무엇인지는 중요하지 않습니다 식별자는 실제로 중요하지 않습니다 그것이 유일 할 때까지 for 루프를 만들 것입니다

그래서 그것이 유일하다면 그래서 for 루프를 만들고 싶습니다 Swift에서 for 루프를 만드는 방법에주의를 기울여보십시오 Swift에서 for 루프를 작성하는 방법에 유의하십시오 다른 언어와 조금 다릅니다

다른 언어와 비교해 볼 때 시작됩니다 조금 다릅니다 동일합니다 식별자의 경우 이것은 일부 변수에 대한 것일뿐입니다 식별자의 경우 이는 일부 변수를 유지하기위한 것일 뿐이지 만 당신은 0, 20 이하, i + 더하기, i = 0; i <20; i ++와 같이 쓰지 않는다고 말하지 않습니다

우리는 그 중 아무 것도하지 않고 대신에 in이라는 단어를 사용합니다 우리는 전혀 쓰지 않습니다 대신에 다음 키워드를 사용합니다 그리고 나서 바로 여기 스위프트에서 무엇이든 될 수 있습니다 다음은 스위프트에서 어떤 시퀀스가 ​​될 수 있습니다

스위프트의 시퀀스 란 스위프트에서 시퀀스를 나타낼 수있는 모든 것을 의미합니다 어딘가에서 시작하여 다음 위치로 갈 수 있고, 다음 위치로 이동 한 후 다음 위치로 이동 한 다음 다음 위치로 이동할 수 있습니다 다음 위치로 가면 for 루프가하는 것입니다 다음 위치는 for 루프가하는 것입니다 어딘가에서 시작하여 다음 위치로 이동하여 특정 위치에서 시작하여 다음 위치에 도달합니다

다음 위치로 이동하고 다음 위치로 이동 한 후 다음 위치로 이동합니다 그래서 Swift에서의 시퀀스의 예는 무엇입니까? Swift에서의 시퀀스의 예는 무엇입니까? 배열? 좋아, 분명히 배열, 첫 번째 배열에서 시작할 수 있니? 예, 분명히 배열에서, 당신은 첫 번째 요소에서 얻을 수 있습니다 요소를 선택하고 다음 요소로 이동 한 후 다음 요소로 이동하고 시작한 후 다음 요소로 이동 한 후 다음 요소로 이동합니다 끝까지 도착할 때까지 끝 위치에 도달 할 때까지 문자열, 문자열은 시퀀스입니다

첫 번째 문자, 문자열, 문자열 또한 시퀀스입니다 첫 번째 문자 다음 문자로 이동, 다음 문자로 이동, 다음 문자로 이동, 다음 문자로 이동 다음 캐릭터는 내가 여기서 사용할거야 정말이야 나는 그것을 여기에서 사용할 것이다 셀 수있는 범위를 셀 수있는 범위라고 부릅니다 CellableRange라는 매우 멋진 시퀀스가 ​​있습니다

셀 수있는 범위는 범위입니다 즉, 시작이 있으므로 CountableRange가 Range입니다 즉, 시작 부분이 있습니다 그리고 끝, 그리고 그것은 셀 수있다 다시 말하면, 끝

그리고 그것은 셀 수있다 사실 그것은 그것을 통해 셀 수있는 방법을 알고 있고 다음 공간으로갑니다 그것을 통해 셀 수있는 방법을 알고 다음 장소로 Swift에는 특별한 구문이 있습니다 왜냐하면 Swift에서 특별한 구문입니다 셀 수있는 범위를 만들고 싶다면 CountableRange를 만드는 것이 일반적입니다

셀 수있는 범위의 시작은 다음과 같이 실행됩니다 CountableRange to <, 0에서부터 <처음부터 0까지의 의미를 의미합니다 카드 쌍 수는 포함하지 않습니다 numberOfParisOfCards (포함하지 않음) 그래서 이것은 for 루프를 통과 할 것이므로 이것은 for 루프이고, 그것은 통과 할 것입니다 왜 그것을 절단하지 않는가? 나는 그것을 선택하지 않았다 왜 이것을 잘라 내지 않는 것일까? 나는 그것을 선택하지 않았다 내 생각 엔? 자, 가자

붙여 넣기 끝내 겠어? 잘라내, 붙여 넣기 통과 할 것이다 카드 쌍 수입니다 이제 또 다른 종류의 numberOfParisOfCards가 있습니다

이제, 또 다른 것이있다 Countable range creator here 점은 CountableRange를 만드는 방법입니다

여기는 0을 의미하며, 여기를 포함하여 0부터 시작하여 여기에 포함됩니다 그래서, 여기, 만약 내가 그것을 사용하고 싶다면, 나는 하나의 점을 말할 것입니다 이것을 사용하려면 처음부터 그것을 쓸 것입니다 Do not, 나는이 많은 카드 만 원한다 그래서, 나는 그렇게 많은 카드가 필요하기 때문에 조금만한다

그래서 셀 수있는 범위 실제로이 유형의 유형을 보면 CountableRange입니다 사실,이 물건의 유형을 보면 그것은 셀 수있는 범위가 될 것입니다 좋아, 이제 나는 통과 할 것입니다 Countable Range를 쓸 것입니다

좋아, 그래서 나는 트래버스 할 것이다 여기에 카드를 만들지 만 다른 카드가 필요합니다 그런 다음 카드를 만드십시오하지만 다른 카드가 필요합니다 그래서 나는 matchingCard = 같은 것을 말할 수 있습니다, 맞습니까? 그래서 나는 matchingCard =라고 쓰고, 똑같은 내용이 뒤따 랐나, 그렇지? 같은 식별자를 가진 다른 카드를 만드십시오

같은 식별자를 가진 다른 카드를 만듭니다 이것은 패스처럼 들린다 맞지? 지금 내가 맞을 수있는 카드가 두 장있어? 이제 2 개의 일치하는 카드가 있으므로 추가해야합니다 여기 내 카드 묶음 항상 두 장의 카드가 필요합니다

항상 두 장의 카드가 필요합니다 하지만 당신은 놀랄만 한 사실은 내가 실제로 필요조차하지 않는다는 것을 안다하지만 놀라움은 내가 필요조차하지 않는다는 것을 안다 바로 여기에서해라 나는 단지 이것을 할 수있다, 여기에서이 일을해라

나는 이것을 할 수있다 왜냐하면 당신이 구조체를 할당 할 때 어떤 카드가 구조체를 할당 할 때 때문입니다, 카드는 구조체입니다 구조체를 다른 변수에 복사하면 복사되고 다른 변수를 할당하면 값이 복사됩니다 그래서 matchingCard는 카드의 복사본입니다 할당하는 것만으로 카드의 복사본이됩니다 그것을 그것에 할당하는 것만으로 그것은 사본을 만듭니다

이제 카드와 사본이 있습니다 그래서 실제로 사본을 만들었습니다 이제 카드와 복사본이 있습니다 내가 말할 수있는 카드 append, 그래서 나는 cards

append를 쓸 수있다 이것이 배열에 무언가를 추가하고 카드를 추가하는 방법입니다 배열에 무언가를 추가하는 방법입니다 이 카드 추가 그런 다음 cardsappend에 일치하는 카드 인 matchingCard를 입력합니다

그러면 cardsappend가 일치하는 카드 즉 matchingCard와 일치합니다 이제이 두 개의 일치하는 카드를 배열에 추가 했으므로 이제이 두 개의 일치하는 카드를 배열에 추가했습니다 그리고 그 수의 카드 쌍을 할 것입니다이 루프에서는 총 numberOfPairsOfCards 시간을 할 것입니다

타임즈, 내 카드있어, 내 카드 배열있어 그러나 나는이 일치하는 카드조차 필요로하지 않는다 그러나 나는이 일치하는 카드조차 필요가 없다 나는 그것을 제거 할 수 있고, 대신 append (card)라고 말하면된다 나는 그것을 제거하고 append (card)로 대체 할 수있다 배열에 물건을 넣거나 꺼내기도하기 때문에 물건을 배열로 만들거나 꺼내는 것입니다

카드를 복사하십시오 실제로 세 개의 카드가 있습니다 사실 여기에는 세 개의 카드가 관련되어 있습니다 자, 내가 만든이 복사본은 여기에 넣어지며, 내가 만든 복사본과 여기에 복사 된 복사본입니다 여기에 또 다른 복사본이 있습니다 여기에 복사 된 다른 복사본이 있습니다

그래서 이 구조체를 전달할 때이 원리를 이해하면 이해할 수 있습니다 구조체를 통과하면 이해할 수 있습니다 실제로 복사하고 있습니다 이제이 카드 중 하나를 위로 향하게 한 다음 카드 중 하나를 뒤집을 때 사본은 실제로 실제 사본 일 것이며 사본은 카드의 실제 사본입니다 그것들 중 오직 하나만이 같은 카드에 대한 포인터가 아니며 뒤집힌 카드 일 것입니다

그래서 그것은 카드에 대한 포인터가 아닙니다 메모리는 실제로 두 개의 서로 다른 카드입니다 그런데 메모리 주소는 두 개의 서로 다른 카드입니다 또한 우리가이 다른 구문을 할 수있는 또 다른 멋진 방법은 다른 멋진 문법으로 할 수 있는가? 카드 배열, 카드 배열 + = 두 장의 카드가있는 다른 배열의 카드 + =이 두 장의 카드가 들어있는 다른 배열의 카드 플러스는 배열과 함께 작동합니다 배열을 함께 추가 할 수 있습니다 + =이 구문은 배열에서도 똑같이 작동합니다

배열을 함께 추가 할 수 있습니다 그리고이 카드를이 어레이에 넣으면이 카드를이 어레이에 놓은 다음 이 배열에있는이 카드는 그것을 복사합니다 그리고이 카드를이 배열에 추가하십시오 실제로이 배열도 찍히고, 실제로이 배열도 복사됩니다 사촌 어레이는 구조체입니다

좋아요, 그래서 우리는 그것을 얻었습니다 왜냐하면 배열은 구조체이기 때문입니다 Ok, 지금 우리는 여기에 도착했다 이것은 모두 잘 진행되고 있습니다 나는 모든 것이 순조롭게 진행되지는 않았습니다

나는 그것을 정말로 좋아하지 않는다 이것에 관해서는 나에게 정말로 옳은 것처럼 보이지 않는다 잘못된 것 같다 집중 게임은 플럽 게임의 식별자를 선택해야 카드의 식별자를 선택해야합니다 집중 게임이 아니기 때문에 카드 식별자가 무엇인지주의하십시오 그들이 신경 쓰는 것은 그들이 유일하다는 것입니다

그래서 정말로, 그것들은 그들이 유일 할 때만 신경을 씁니다 그래서 나는이 일을하고 싶지 않아,이 일을 여기서 꺼내고 싶다 나는 이것을하고 싶지 않다 나는 그것을 여기에서 분리하고 싶다 카드에 고유 한 식별자가 있는지 확인하십시오

고유 한 식별자가있는 카드가 있습니다 카드가 10 억과 7을 선택하는 이유는 없습니다 카드가 100 억을 선택해야 할 이유가 없습니다 그리고 그것은 유일합니다 그래서 이것이 유일 할 때까지 식별자입니다

결코 절대로 그렇게되지 않을 것입니다 10 억 개와 7 개가있는 다른 카드를 제공하지 않으며 10 억 개에서 7 개까지 카드를 할당합니다 그렇다면 그것이 유일해야합니다 그것이 내가하는 일입니다 그것이 유일한 것입니다

그렇게해야합니다 이 식별자는이 식별자를 사용할 필요가 없지만이 init 메서드는이 식별자 매개 변수를 생략하고 싶습니다 그러나 여기서 init이 식별자를 사용하지 않는다면, 여기에 init 메소드가이 매개 변수를 가지고 있지 않다면 우리는 Gota는 여기서 고유 한 식별자를 만드는 방법을 파악합니다 따라서 고유 한 식별자를 만드는 방법을 파악하려면 우리가 어떻게 할거 니? 글쎄, 내가 너에게 가르쳐 줄거야 어떻게해야하지? 좋아, 나는 너에게 가르쳐 줄거야

또 다른 시원한 스위프트 것, 나는 스위프트를 만들 예정이다 또 다른 멋진 것, 나는 또 다른 멋진 것을 만들고 싶다 특별한 종류의 메소드 정적 메소드입니다 정적 방법 그것은 같은 구문 func이지만 그것 앞에 static을 가지고 있으며 그것 앞에 정적 키워드가 있다는 것을 제외하고는 같은 함수 구문을 가지고 있습니다

고유 식별자를 얻으려고합니다 고유 식별자를 반환 할 것입니다 돌아올거야 고유 한 정수가 될 때마다 그리고 내가 호출 할 때마다 고유 한 정수가됩니다 그리고 내가 그것을 부를 때마다 나에게 또 다른 유일한 식별자를 돌려 줄거야

다른 고유 한 식별자를 돌려 줄거야 고유 한 식별자를 돌려 주면 고유 한 식별자가 반환됩니다 우리는 그것을 작동시켜야 할 것입니다 자, 정적이 무엇입니까? 우리는 그것을 작동시켜야합니다 자, 정적 함수는 무엇에 관한 것입니까? 정적 함수는 함수이며, 함수는 무엇입니까? 정적 함수는 함수입니다

카드 클래스에 있어도 Card 클래스 안에 있더라도 보낼 수 없으며 카드 인스턴스를 사용할 수 없습니다 카드로 : 카드가이 메시지를 인식하지 못합니다 카드 인스턴스가이 메시지를 이해할 수 없습니다 이 메시지를 이해하는 것은 유형 카드입니다이 메시지를 이해하는 것은 Card 클래스입니다 타입 자체에 보내면 클래스 자체에 보냅니다

그래서 여러분은 그것을 세계적인 함수처럼 생각할 수 있습니다 그래서 어느 정도 전역 적 함수라고 생각할 수 있습니다 유틸리티 함수 또는이 클래스를 사용하여 유틸리티 함수 또는 다른 것과 연결되어있는 것 유형 이해가 되니? 카드에 보내지 마라 이것을 말하는가? 카드로 보내지 않을거야

카드에 고유 한 식별자를 요청할 수는 없으며 카드에 고유 한 식별자를 요청할 수 없습니다 당신은 카드 타입을 묻습니다 그래서, 그것은 정적이라는 것을 의미합니다 카드 클래스 자체에게 물어봐야합니다 이것은 정적의 의미입니다

그래서 여기에이 함수를 호출 할 때이 함수를 여기에서 호출하려고합니다 나는 그것을 cardgetUniqueIdentifier 형으로 보낸다 나는 그것을 CardgetUniqueIdentifier 클래스로 보낸다

카드 타입에서 가져오고있어 이제 어떻게해야 문법을 쓸 수 있을까? 이제 어떻게 변경합니까? 구현하면 고유 한 식별자를 얻을 수 있습니까? 음,이 함수는 고유 한 식별자를 얻습니까? 나는 정적 변수를 가질거야, 당신도 그 변수들을 가질 수있다 정적 변수를 갖고 싶다 이렇게 할 수 있기 때문이다 그래서 그것은 타입과 함께 저장되는 변수입니다, 그래서 여기 클래스와 함께 저장되는 변수가 있습니다

개별 카드가 아닌 개별 카드 인스턴스와 함께 저장됩니다 이 변수는 각 변수와 같습니다 각 개별 카드는 유형과 함께 저장되며 카드 인스턴스는 저장되며 클래스와 함께 저장됩니다 그리고 이걸 내 식별자라고 부르 겠어 Factory, 나는 그것을 식별자로 부를 것이다

팩토리 (식별자 팩토리) 나는 단지 0으로 시작할 것입니다 그리고 나서 여기에서 나는 0으로 시작할 것입니다 여기에 CardidentifierFactory + = 1은 CardidentifierFactory + = 1을 쓸 것입니다

새로운 고유 식별자로 변경 한 다음 새 고유 식별자를 생성합니다 그럼 내가 돌아올거야 Return CardidentifierFactory 이제는 고유 한 Card

identifierFactory를 반환합니다 이제는 고유 한 식별자를 반환합니다 이것을 호출 할 때마다 고유 한 int가 만들어지며 호출 할 때마다 고유 한 정수가 생성됩니다 그것은 0에서 시작하여 매번 고유 한 int를 만듭니다 0부터 시작하기 때문에 매번 하나씩 추가되어 새로운 고유 번호를 생성합니다

흥미로운 점은 지금 카드를 말 할 필요가 없다는 것입니다 재미있는 점은 실제로 카드를 쓸 필요가 없다는 것입니다 내가 정적 메서드에 있기 때문에 점에 액세스 할 수 있으므로 점이 정적 함수에 있기 때문에 점에 직접 액세스 할 수 있습니다 카드가없는 스태틱 vars 그래서 멋지다

카드를 사용하지 않는 정적 변수 이것은 꽤 멋지다 그래서 저는이 작은 우회로를 보여주기를 원합니다 어떻게하면 좋을지를 보여주고 싶습니다 이러한 유용한 유틸리티 메소드를 사용하거나이 유형의 훌륭한 툴 메소드를 사용하는 방법은 무엇이든 할 수 있습니다

유형에 대한 유틸리티 변수 이제 도구 변수로 돌아가 보겠습니다 이제 우리에게로 돌아 가자 우리의 집중력은 여기에 경고가 있습니다 농도를 봅시다

우리는 경고를하기 때문에, 저희에게 알려주십시오 이 경고가 무엇인지 확인하십시오 불변의 가치가 있습니다이 경고의 내용을보십시오 불변의 값을 씁니다

식별자는 사용되지 않았습니다 identifer, this, never used 언더 바 (underbar)로 대체하거나 제거하는 것을 고려합니다 밑줄로 바꾸거나 제거하는 것을 고려합니다 컨트롤이기 때문에 제거 할 수 없습니다 좋아요, 제거 할 수 없습니다

우리가 루프를 대체하는 변수 우리 for 루프 제어 변수로 대체 할 수 있습니다 하지만 우리는 그것을 언더 바 Swift의 Underbar는 이것을 무시하거나 밑줄을 긋는 것을 의미합니다 스위프트에서 언더 라인은 일종의 무지 또는 나는 이것이 정말로 무엇인지 신경 쓰지 않는다 나는 그것을 사용하지 않을 것이기 때문에 나는 상관하지 않는다 그리고 우리는 전에 이것을 실제로 사용했습니다

기억합니까? 그리고 실제로이 문법을 사용했습니다 기억합니까? ViewController, touchCard, ViewController, touchCard 연산을 반환하십시오 외부 이름이 밑줄이었습니다 즉, 매개 변수 태그가 밑줄이므로 매개 변수 태그를 호출하면 기억할 때 매개 변수 레이블을 지정하지 않기 때문에 외부 이름을 지정하십시오 터치 카드의 Objective-C에 대한 것입니다

터치 카드는 Objective-C와 조금 비슷합니다 이 대상 작업에는 외부 이름과이 대상 작업이 없으므로 매개 변수 레이블도 없습니다 그래서 우리는 방금 말했다, 헤이 그래서 우리는 말했다 나는 외부 이름을 원하지 않는다

우리는 매개 변수 태그를 원하지 않는다 그것과 유사하게, 농도, 우리는 for 루프를하고 있고, 여전히 집중하고 싶습니다 우리는 for 루프를 진행하고 있습니다 이것은 여러 번이지만, 우리는 어떤 식별자가이 루프를 여러 번하고 있는지 상관하지 않지만이 식별자가 무엇인지 신경 쓰지 않습니다 우리는 더 이상 여기에서 사용하지 않습니다

알았어, 우리는 결코 다시 사용하지 않을 것이기 때문에 이해하니? 확인 초기화 할 때 마지막으로해야 할 일은 마지막으로해야 할 일은 초기화 할 때입니다 카드를 섞어 버리는 것입니다 나머지는 뒤섞습니다 왜냐하면 우리가 카드를 섞지 마십시오

그러면 항상 뒤섞이지는 않을 것입니다 항상 쉬울 것입니다 항상 같은 순서 같은 순서로하는 것이 정말 쉽습니다 그것은 게임을 만들 것입니다

게임을하고 숙제를 위해 떠날거야 아주 간단 해 나는 네 숙제로 남겨 둘 것이다 너의 직업은 그곳에서 카드를 섞어 버릴거야 너의 임무는 섞이는거야 그것은 다시 한번,이 값 유형 배열을 이해하도록 요청하고 다시 이해하도록 요청합니다

이 값 유형 배열 또는 값 유형, 등등 그것은 꽤 좋은 연습 유형 또는 값 유형입니다 그것은 아주 좋은 운동이다 그러니 그걸로 떠날거야 그래서 나는 너에게 맡길거야 전체 초기화 문제를 해결 했으므로 초기화 문제를 해결했습니다

그래서 이제 우리는 여기서 view controller로 돌아갈 수 있습니다 그리고 이제 우리는 ViewController로 돌아갈 것입니다 그것을 찾아라 그것이있다 그리고 집중

그것을 발견해라, 그것이 여기에있다 그리고 농도 바로 여기에 카드 쌍 수를 지정해야합니다 numberOfPairsOfCards 및 여기에 입력 할 숫자는 무엇입니까? numberOfParisOfCards, 여기에 입력 할 숫자는 무엇입니까? 맞아, 우리가 4 개를 넣을 수있을 것 같아 네 여기 네 개를 넣을 것 같아요

우리는 UI에 4 개의 카드가 있다는 것을 알고 있습니다 우리의 UI에는 이미 4 개의 카드가 있습니다 하지만 더 많은 버튼을 추가하고 싶다면 어떻게해야합니까?하지만 더 많은 버튼을 원한다면 어떻게해야합니까? 이제 여기서 다시 와서이 네 ​​가지를 바꿔야 겠어? 이제 돌아가서이 네 가지를 바꿔야 해 카드 버튼 수를 계산하지 마십시오 카드 버튼 수를 직접 계산하지 않으시겠습니까? 기억하지? 카드 버튼들, 그 모든 버튼들이 그 안에있어, 기억 나니? cardButtons 모든 버튼은 여기에 있습니다

cardButtonscount입니다 그 카드의 수는 얼마이며, cardButtonscount입니다 그 숫자는 얼마나 많은 카드가 있는지입니다

우리는 2로 나눌 것입니다 좋아, 이해가 되니? 그럼 우리는 2로 나누면된다 좋아, 이해가 되니? 이걸 조금 더 잘 볼 수있게합시다 우리는 이렇게 보자 좀 더 낫게 보일 수 있도록

카드 버튼을 두 개로 나누기 만하면됩니다 그래서 카드 버튼을 쓰고 두 개로 나누면됩니다 4 개의 카드 버튼이 있다면, 분명히 2 개의 쌍입니다 그래서 4 개의 카드 버튼이 있다면, 분명히 2 개의 쌍이 있습니다 실제로 나는 조심해야합니다

사실, 나는 더 진지해야합니다 홀수 개의 카드가있는 경우, 홀수 개의 카드가있는 경우, 나는 라운드를하고 싶을 것이다 그래서 내가 카드를 3 ​​장 가지고 있다면 나는 그것을 반올림해야 할 수도있다 3 장의 카드가 있다면 두 쌍의 카드에는 총 4 장의 카드가 있습니다 두 쌍의 카드로 총 4 장이 있습니다

나는 그 세 번째 카드와 결코 일치 할 수 없지만 나는 세 번째 카드와 결코 일치하지 않을 것이다 최소한 게임에는 충분할 것입니다 자,이게 맞습니다 최소한 게임은 정상적으로 수행 할 수있는 숫자를 가지고 있습니다 이것이 옳은 일이다

할 일이 있지만 여기에 아주 심각한 오류가 있습니다 좋아요,하지만 저는 아주 심각한 실수를 저질렀습니다 알았어 그것을 봅시다, 인스턴스 멤버를 사용할 수 없다고 말합니다 여기서는 인스턴스 멤버를 사용할 수 없다고 말합니다

속성 버튼, 바로 여기, 속성 이니셜 라이저 내에서 cardButton, 속성 생성자 내부 오, 그래, var 게임은 재산이고 네, 게임 변수는 재산이고 내가 일하고있어 나는 그것을 초기화하고있다, 그것은 속성 초기화 자다 초기화한다, 그것은 속성 생성자이다 자체가 사용 가능하기 전에 속성 이니셜 라이저가 실행된다고 말하면 자체가 사용 가능하기 전에 속성 생성자가 실행된다고 말합니다 오, 당신이 스위프트에서 당신은 내가 스위프트에서해야한다고 말했던 것을 기억해야한다는 것을 기억하십시오

뭔가를 사용하기 전에 먼저 사용할 수있는 것을 초기화하십시오 막대에 액세스하기 전에 막대에있는 항목을 사용하고 속성을 포함하여 완전히 초기화하십시오 함수를 호출하고, 함수를 호출하는 함수는 무엇이든 분명히 아직 완전히 초기화되지 않았습니다 아직 완전히 초기화하지 않았 음은 분명합니다 게임을 초기화하는 중이므로 게임 인스턴스를 초기화하는 중입니다

게임은 초기화되므로 게임은 초기화되는 인스턴스입니다 여기에 캐치 -22가 있습니다 어떻게 할 것인가? 우리는 딜레마를 겪습니다 어떻게해야합니까? 하나가 다른 것에 의존하는 곳? 하나의 var가 의존하는 곳 여기에 다른 하나에 의존하는 사람이 있습니까? 하나의 변수는 다른 변수에 의존합니다 이 문제를 해결할 수있는 몇 가지 방법이 있습니다

하지만 너를 친절하게 보여줄거야하지만 너에게 보여주고 싶다 게으르다 멋진 게으른 길, 게으른 키워드 변수를로드하는 게으른 경우 누군가가 잡을 때까지 초기화되지 않는다는 것을 의미하기 때문에 실제로 초기화되지 않습니다

누군가 그것을 사용할 때까지 누군가가 그것을 사용하기를 원할 때까지 시도합니다 누군가가 사용하려고하면 게임을 사용하려면 게임을 초기화하고 게임을 초기화합니다 정의상으로, 바로이 같은 대칭 때문에, 정의상으로 지금은 없습니다이 상충되는 딜레마 때문에 이 게임이 완전히 초기화 될 때까지 게임을 시도하고 사용할 수 있습니다 게임 인스턴스가 완전히 초기화 될 때까지는 아무도 게임 인스턴스를 사용할 수 없습니다

우리가 이기면, 완벽하게 작동합니다 그리고 게으른 카운트로서, 우리가 이기게되면 완벽하게 작동합니다 그리고 이것을 게으른 키워드입니다 이 변수는 초기화되었습니다 게임 시작하기

변수가 초기화되었습니다 이 게임을 성공적으로 개발하자 이 방법은 정말 멋지다 여기에는 하나의 제한이있다 하지만 여기에는 게으른 것에 대해서, 그렇게 좋지는 않습니다

게으름의 한계, 이것은별로 좋지 않습니다 즉, didSet을 사용할 수 없습니다 시도하면 didSet 구문을 사용할 수 없습니다 시도한 경우 didSet을 여기에 추가하려면 여기에 flipCount와 마찬가지로 didSet을 추가하고 flipCount에 대해 수행한다고 생각하십시오 그거 기억하지? 여기가 잘못 될거야, 기억하지? 추가하면 오류가 발생합니다

이것은 충돌 선언입니다 예를 들어, 근본적으로 이것은 충돌 진술 등입니다하지만 기본적으로 게으른로드 된 변수에서 사용할 수 없다는 속성 관찰자를 사용할 수 없다는 것이 여기 있습니다 게으른 var 속성 관찰자를 사용해야 할 경우 특성 관찰자

따라서 어딘가에서 속성 관찰자를 사용해야하는 경우 게임이 바뀔 때마다 알아야합니다 각 게임이 어디에서 변경되는지 알아야합니다 당신은 다른 방식으로해야 할 것입니다 당신은 다른 방식으로 그것을 할 것입니다 그건 그렇고 다른 방법은 무엇입니까? 글쎄, 너는 갈거야

다음 주에 다음과 같은 방법이 있다는 것을 다음 주에 배웠습니다 나는 몇 가지 방법을 배웠습니다 출구가 연결되면 모든 시스템이 호출됩니다 시스템이 하나를 호출합니다 방법 및 거기에서 당신은 게임 인스턴스를 초기화 할 수있는 게임 메서드를 초기화 할 수 있습니다

그리고 아마 당신은 선택 사항으로 만들거나 어쩌면 옵션 유형으로 설정하고 싶을 수도 있습니다 어쩌면 암시 적으로 래핑되지 않은 옵션 일 수도 있고 암시 적으로 구문 분석 할 수있는 선택적 유형 일 수도 있습니다 너에게 약간의 힌트가있어하지만 너는 그걸 필요로하지 않을거야 이건 너에게 조금 힌트이지만 너의 숙제 야

너의 숙제는 그래도 할 수있을거야 너는 이걸로 할 수있어 네 숙제 네 좋아, 좋아 이제 게임과 숙제가있어 좋습니다 이제 우리는 게임을했습니다

큰 녹색 화살표 컨트롤러가 녹색 채널로 우리 컨트롤러와 모델간에 의사 소통을하고 있습니다 모델 우리는 다음에 무엇을해야합니까? 다음에 무엇을해야합니까? 돌아가서 Google의 Concentration API를 다시 살펴 보겠습니다 돌아가서 Google의 Concentration API를 확인하십시오 우리가해야 할 일 두 가지가있는 것처럼 보입니다

우리가해야 할 일이 있는지보십시오 그것은 두 가지를 가진 것처럼 보인다 우리는 API의이 부분을 사용했습니다이 두 부분을 남겨 두었으므로 API를 일부 사용했습니다 우리 둘은 떠났어

그래서 이걸 해봅시다, 카드를 선택하십시오 우리는 이것을 다루겠습니다 카드를 선택하십시오 카드가 선택되면 우리의 카드가 선택 될 때의 집중 모델이 집중 모델을 말하고 싶습니다

우리 컨트롤러가 컨트롤러에 언제 있는지 정확히 알 수 있습니다 컨트롤러에서 정확한 시간을 알 수 있습니다 터치 카드에 바로 있습니다 버튼을 터치 할 때마다 터치 카드 방식입니다 버튼이 touchCard를 호출 할 때마다 카드, 우리는 카드가 눌러 진 것을 압니다

우리는 카드를 클릭했음을 압니다 그리고이 플립 카드를 이모티콘으로 선택하는 대신 flipCard (withEmoji : 선택한 표현식) 바로 여기에, 난 그냥 내 게임 헤이,이 방법을 말할거야, 내가 gamechooseCard (at :)을 사용합니다 이 카드를 선택하십시오 게임에이 카드를 선택하도록하십시오

그래서 직접 처리하는 대신 모델이 내 자신의 컨트롤러를 처리 할 수 ​​없게하고 모델을 보자 그것을 처리하십시오 그래서, 그것을 알아내는 것입니다 그것을 다루기 위해 모델이 로직을 구현하게하십시오 그러나 여기서 주목할만한 것이 있습니다 만, 우리가주의를 기울이는 것은 흥미 롭습니다 모델이이 카드를 선택하도록 할 때 모델에서이 카드를 선택하도록 할 때입니다

게임이 바뀔 수도 있고 실제로 바뀔 수도 있습니다 게임의 상태가 바뀔 수도 있습니다 그것은 일치해야하기 때문에 사촌을 변경하고 그것을 원합니까 모든 종류의 것들 그래서 바뀔거야

그래서 지금, 기다려라 그래서 게임의 상태가 바뀔 것이다 모델에서 뷰를 업데이트해야합니다 그러면 모델에서 데이터 업데이트 뷰를 가져와야합니다 우리의 견해가 모델과 약간의 싱크를 벗어났습니다

현재의 견해는 모델을 변경하지 않았습니다 우리가이 카드를 선택할 때, 우리가이 카드를 선택할 때 게임이 변경 될 수 있습니다 게임의 상태가 변경 될 수 있습니다 따라서 updateViewFromModel과 같은 메소드가 필요하거나 updateViewFromModel과 비슷한 메소드가 필요합니다 어떤 종류의 func은 모델을 가지고 뷰를 업데이트하기 위해 아래와 같은 메소드를 구현합니다

Func updateViewFromModel 그리고 무엇이 그렇게할까요? func updateViewFromModel 무엇을할까요? 이제이 API의 다른 부분을 사용하게 될 것입니다 API의 다른 부분을 사용할 것입니다 모든 카드를 볼 것이고 모든 카드를 보러 갈 것입니다 모든 카드 버튼이 일치하는지 확인한 다음 버튼과 카드가 일치하는지 확인하십시오 그들이 얼굴을 마주 보든, 어울리는 지, 얼굴을 위로하고, 짝을 지어? 그 모든 사업

우리는 게임 등을 들여다 봅니다 게임 모델에 가자 알아 내고 카드가 맞는지 확인하십시오 카드의 상태를 확인한 다음 버튼이 올바른지 확인하십시오 그러면이 updateViewFromModel을 어떻게 구현합니까? 그럼, updateViewFromModel은 어떻게 구현합니까? 그럼 모든 카드 버튼을 통과하고 카드의 모든 버튼을 가로 지르고 싶습니다

게임을보고 적절하게 설정하십시오 그러면 게임 모델을 비교 한 다음 버튼을 올바르게 설정할 수 있습니다 내 cardButtons 버튼에 대한 또 다른 루프에 대한, 난 forButtons에있는 버튼에 대한 루프를 사용할 수 있습니다 이제 각 버튼은 카드 버튼의 각 버튼에 대해이 버튼을 누르면됩니다 이 유형을 보면 UI 버튼이 될 것입니다이 유형을 보면 UIButton이 될 것입니다

이것은 일련의 버튼이기 때문에 멋지 지 않은가? 이것은 일련의 버튼이기 때문에 이거 괜찮 니? 하지만 사실은 그렇게하지 않을거야 그러나 나는 이것을하지 않을 것이다 나는 이것을 찾아야하기 때문에 다른 것을 할 것이다 나는 다른 방법을 선택할 것이다

왜냐하면 내가 사용하기를 원하기 때문이다 이 카드에있는 버튼의 색인은 내가이 버튼의 해당 카드를 찾는 버튼 색인을 위해 할 것이므로 인덱스에 의한 루프 : 카드 인덱스에서 루프 인덱스를 선택할 수 있습니다 cardButtons 배열을 탐색하려면 다음을 수행하십시오 0 도트가 cardButtonscount보다 작 으면 0

<cardButtonscount 모두가이 셀 수의 범위를 여기에서 이해하지만 모두가이 CountableRange를 이해하고 있습니까? 나는 너에게 다른 것을 보여 주겠다하지만 나는하지 않을 것이다 나는 너에게 다른 길을 보여주고 싶다

CardButtonsindicies, cardButtonsindices, cardButtons를 사용하는 cardButtonindicies 인덱스 인덱스는 배열의 한 메소드입니다 좋아요, 그 returs 인덱스는 배열의 메소드입니다 (참고 : 변수)

당신은 배열에있는 모든 색인의 셀 수있는 범위입니다 배열의 모든 색인으로 구성되는 셀 수있는 간격을줍니다 사실, 옵션을 클릭하면 인덱스를 볼 수 있습니다 유형을 봅니다 실제로 인덱스를 클릭하여 해당 유형을 볼 수 있습니다

int의 유효 범위 좋아요 그래서, Int로 구성된 CountableRange입니다 이는 모든 지표를 살펴볼 수있는 멋진 방법입니다 이것은 인덱스를 트래버스하는 흥미로운 방법입니다

이제 인덱스가 생겼으니 지금 인덱스가 있습니다 let 버튼이 해당 색인의 cardButton과 같다고 말하면됩니다 해당 색인의 cardButtons 버튼에 버튼을 지정할 수 있습니다 카드를 게임의 카드와 같게 한 다음 카드 배열에 카드 = 게임을 놓습니다 그 색인에서

이건 정말 끝내 주네 나는 단추를 가지고있다 그 색인에있는 카드 아주 좋아, 그 버튼있어 카드가있어

일치시켜야 해 카드도 가지고있어 동기화 만하면됩니다 그래서 카드가 위로 향하게되면, 카드가 앞면이 보이는지 판단해야합니다 그런 다음 UI로 얼굴을 대면됩니다

그렇다면 앞 UI를 보여 드리겠습니다 이게 바로이 배경입니다이 하나, 흰색이 배경입니다 그러니 그걸 해봅시다 그렇지 않으면, 아래로 내려 가면이 코드를 옮기십시오

그렇지 않으면 다운 여기에 오렌지 배경을 넣고 싶습니다 그런 다음이 오렌지 배경에 코드의이 부분을 사용합니다 그리고 이제 저는 플립 카드가 필요 없습니다 이제 플립 카드 방법이 필요 없습니다 플립 카드를 없애자

모두, 플립 카드 방법을 삭제합시다 모두 내가 자네가 한 짓을 보자 방금 했었어 내가 한 짓을 보아라 나는 방금 버튼이 카드와 일치하는 것입니다

버튼 하나에 해당 카드가 표시됩니다 한 가지 더 그건 그렇고, 카드가 일치 할 수 있습니다 그들은 일치합니다 우리는 카드를 isMatched 변수와 짝을 지을 수 있습니다 우리가 카드에 그걸 넣었을 때, 기억이 일치한다는 것을 기억하십시오 그래서 우리 카드에 일치를 기억하십니까? 나는 그것을 처리 할 필요가있다

그리고 나는 그렇게 할 것이다 나는 이것을 처리 할 필요가있다 그리고 내가 구현 한 방식은 일치하는 카드를 분명하게 만들 예정 이니 페어링 된 카드를 투명하게 만들고 싶습니다 카드를 찾지 못하면 카드를 볼 수 없습니다 이미 페어링 된 경우 UI를 백그라운드로 가져 가려고합니다

배경색 만 지정하면됩니다 UI를 "옮깁니다" 주황색이 아니라 일치하고 투명 해지면 주황색이 아닌 투명하게 표시하십시오 페어링 된 경우 아래로 향하게 일치하고 여전히 직면하면, 나는 싫어

내가 여전히 얼굴을 맞대고 싶지 않다면 분명히, 나는 사람들이 너에게 성냥을 보게하고 싶다 투명하게 만들고, 사람들이 그 성냥을 보게하고 싶다 하지만 Match에서 경기가 끝나면 나는 그것을 원하지 않는다하지만 그들이 일치하는 한 나는 그것을 원하지 않는다 보여주기 위해서 내가하는 일은 이것을하는 것입니다

그래서 내가해야 할 일은 물음표 cardisMatched? 투명 : 주황색 모두가 이것을 알고 있습니까? 페어링은 투명합니다 그렇지 않으면 오렌지색입니다 다 알고 있니? 물음표 콜론? 우리는 C와 다른 언어로 그것을 가지고 :?이 삼항 연산자? 이것은 C와 같은 다른 언어에서도 마찬가지입니다 그래, 오렌지 대신에 나는 그것을 분명히하고 싶다

그래서 그것이 쌍을 이루면, 나는 오렌지가 필요 없으며, 투명하게 사용한다 어떻게 알 수 있습니까? 어떤 색깔로 가면 어떻게하면 투명 색상을 얻을 수 있습니까? 어떤 색을 사용하는 경우 Chooser, 아래쪽을 보면 불투명도가 나타납니다 선택자입니다 그런 다음 불투명도의 맨 아래를 봅니다 색상이 얼마나 투명한가? 완전히 불투명하므로 색상의 불투명도가 충분합니다

이것은 완전히 불투명합니다 즉, 카드가 일치하면 완전히 투명합니다 카드가 페어링 된 경우 나는 그것을 분명히 할 것입니다 자, 여기에 또 하나의 오류가 있습니다 그러면 나는 그것들을 투명하게 만듭니다

그러나 여기에는 실수가 있습니다 이 그림은 이모티콘입니다 이제는이 그림이 이모티콘입니다 원래 우리는 emojiChoices에서 인덱스를 기반으로하는 이모티콘 및 인덱스 기반 이모티콘을 사용하여 이모티콘 선택 모든 것 나는 그것을 여기에서 구현하는 것을 연기 할 것이다

나는 이것을 성취하기 위해 나중에 다시 올 것이다 카드에 대한 이모티콘을 호출하고 있습니다 이모티콘 (for : card)을 호출하여 구현합니다 이 기능은 내가 여기서 수행 할 기능이 될 것입니다 아래에서 구현 한 기능이 될 것입니다

이걸 조금 위로 움직여 보자 당신은 그것을 볼 수 있습니다, 형식 카드 인 카드에 대한 이모티콘을 보면 볼 수 있습니다 emoji (for card 🙂 매개 변수의 메서드는 카드 유형입니다 이모티콘을 반환하면 물음표가 반환됩니다 -> String은 표현식을 반환합니다

나는 물음표로 돌아 간다 이제 우리는 물음표를 반환했습니다 임시 이모 지로 사용되었습니다 우리는 이모티콘 선택을 여기서 처리 할 것입니다 우리는이 그림을 다룰 것입니다

우리는 이모티콘 선택을 할 것이고, 결국에는 이모티콘 선택을 사용할 것이고 마지막으로 이모티콘 중 하나를 선택하겠습니다 무작위로 여기서 임의의 표현식 중 하나를 선택합니다 카드에 적어 두었습니다 사실 카드에 몇 개 더 넣습니다 사실, 나는 몇몇을 준비했다

Emojis here, 조금 더 할로윈 이모티콘 할로윈 관련 표현 더보기 그래서 우리는이 많은 emojis 중 하나를 여기에서 골라 낼 것입니다 그래서 여기에서 표현을 선택해야합니다 카드 위에 올려 놓으십시오 하지만 지금은 자, 이제 물음표를 써야 겠어

사촌 나는 물음표를 대신 사용한다 내 UI로 돌아가서 내가 부러지지 않았는지 확인하고 싶습니다 UI가 아닌지 확인하기 위해 UI로 돌아가고 싶습니다 이 모든 MVC 음모가있는 모든 것 MVC가 어떤 부분을 망쳐 놓기 때문에 돌아 가자

다시 가자 모델을 선택하고 카드를 선택할 때 뭔가를하십시오 따라서 모델에서 카드를 선택한 후 처리를 수행하십시오 내가 할 일은 모두 결국 일치시켜야 해하지만 결국에는 짝을 지어야 해

하지만 내가해야 할 일은 모두 이제 내가 할 일은 모델이 카드를 뒤집도록하는 것뿐입니다 모델이 카드를 뒤집어 씌우면됩니다 모델은 지금 카드를 뒤집을 것입니다 그래서 모델은 카드를 뒤집을 것입니다 여기 우리 모델에서 chooseCard에 있습니다

그러면 모델의 chooseCard 메소드로 이동 한 다음 그 색인에있는 카드가 앞면이 위로 향하게되면, 그 색인에있는 카드가 앞면이 보이는지 판단하십시오 그런 다음 해당 색인의 카드를 다음으로 설정합니다 isFaceUp = false이고, 그렇지 않으면 true로 설정합니다 isFaceUp 속성은 false이고, 그렇지 않으면 true로 설정됩니다 사실, 카드를 뒤집을거야

모두들 카드를 뒤집어 놓을거야, 모두들 카드가 뒤집혔다 니 믿어 줘요? 예, 그냥 카드를 뒤집을 수 있을까요? 예, 그게 전부입니다 얼굴을 위로 향하게하면 얼굴은 아래로 향하고 얼굴이 아래로 향하면 위로 향하면 아래로 향하게되고 그렇지 않으면 아래로 향하게됩니다 이제 우리가 앱을 실행할 때, 지금은 끝났습니다 지금 우리 프로그램을 운영합시다

이모티콘이 없으며 모든 것이 물음표가 될 수 있지만 표현은 없으며 모두 물음표가됩니다 카드가 뒤집어 져야합니다 이것은 우리 모두입니다 UI, 여기 컨트롤러가 있습니다 그게 전부입니다

UI 이것이 우리의 컨트롤러입니다 그리고 여기에 우리 모델이 있습니다 게다가 우리는 카드를 가지고 있습니다 그리고 이것은 우리의 모델이고, 우리의 카드 카드 클래스입니다

isMatched를 추적하고 isMatched를 사용하여 페어링 여부를 기록합니다 그 식별자를하는 것입니다 그래서 살펴보고 식별자 식별자를 저장해 봅시다 우리가 한번 보자 이걸 실행하고 아무것도 망가 뜨리지 않았는지 확인하십시오

이걸 실행하고 우리가 어떤 부분을 망쳐 놓지 않았는지 확인하십시오 MVC를 만들었을 때 나누면 항상 좋습니다 MVC를 사용하면 언제나 훌륭한 분업을 할 수 있습니다 간단하게 뭔가를하도록 모델을 만드십시오 그러나 먼저 모델에 간단한 함수를 구현해보십시오

MVC가 실제로 작동하는지 확인하기 위해 MVC가 실제로 사용 가능한지 확인하십시오 여기에 우리가 간다 물론, 이것들을 뒤집어 씌우는 것처럼 보이고, 나타나고있다 그리고 정말로 이것들을 넣고있다 카드는 끝났어

좋아, 훌륭 했어, 우리가 필요로하는 모든 것, 카드 뒤집기 아주 좋아, 그래서 우리는 필요해 우리는 할 일이 두 가지 있습니다 하나는,이 카드에 이모티콘을 가져오고, 두 가지만 있습니다 하나는 표현을 카드에 표시하는 것입니다

두 번째, 실제로 게임을 만들어 실제 게임이되도록하십시오 두 번째 방법은 두 게임을 연결하여이 게임을 실현하는 것입니다 한 가지는 컨트롤러의 것이고, 이모지는 표현력이 컨트롤러를 담당한다는 것을 보여줍니다 또 다른 것은 모델입니다 그래서 우리 컨트롤러로 가보고 다른 모델은 모델을 책임지고 있습니다, 그래서 컨트롤러로가 봅시다 바로 여기,이 이모티콘 일을하십시오

지금 당신과 여기에서 가르치면서 표현을 실현하십시오 가르치는 목적으로 이모티 사진을 보여 주면, 나는 너에게 보여 줄 것이고 나는 표현을 보여줄 것이다 사전을 사용하는 법을 배우고, 사전이며 사전 인 사전을 사용하는 법을 가르쳐줍니다 구조화하는 것이 매우 중요합니다 이것은 매우 중요한 구조입니다

모든 사람이 사전이 무엇인지 알고 있습니까? 누구나 사전을 알고 있습니까? 해시 테이블과 마찬가지로 해시 테이블 (해시 테이블) 일 수있는 데이터 구조 일뿐 아니라 뭔가를 찾아 특정 것에 대한 가치를 얻으십시오 그래서 우리는 사전을 사용할 것입니다 그래서 우리는 사전을 사용해야합니다 그리고 우리 사전은 다음과 같습니다 저는 이모 지라고 부를 것입니다

그리고 우리 사전은 이것과 같습니다 저는 그것을 이모티콘이라고 부릅니다 그 타입은 사전이 될 것입니다 그 타입은 사전, 사전입니다 이제 사전은 배열과 같은 일반적인 유형이지만 사전은 배열과 같이 일반적이지만 당신은 타입의 키를 지정합니다

이것은 동시에 키의 타입을 선언 할 필요가 있습니다 이것은 제가 할 것입니다 int 값을 가져야합니다 이것은 카드 식별자가 될 것입니다 Int 타입을 사용하십시오

이것은 우리 카드의 식별자가 될 것이기 때문입니다 값 (문자열 인 이모티콘)입니다 선언 된 값의 유형, 즉 String 유형은 표현식을 저장합니다 그래서이 이모티콘 사전, 나는 카드를 찾아 볼 것입니다 그래서 이것은 이모티콘을 저장하는 사전입니다, 나는 카드를 발견 할 것입니다

해당 카드를 사용하는 이모티콘을 가져 오는 식별자입니다 다들 알아 냈어, 움직이기 전에 이해해야 해 모두 이해할 수 있니? 나는 내려 가기 전에 이해해야한다 방법에 대해서 나는이 사전들 중 하나가 어떻게 사전을 만드는가? 정확히 배열과 동일합니다

난 그냥 열린 괄호를 할거야, 나는 중괄호를 사용한다 빈 사전을 만드는 닫는 괄호, 빈 사전을 만들기위한 오른쪽 괄호 그래서 이것은 문자열에 매핑 된 int의 사전입니다 그러나 이것은 Int를 String으로 매핑하는 사전입니다 비어 있습니다 이제 이모티콘으로 비어 있습니다

비어 있습니다 다음 그림에서 (카드의 경우) 카드 나는이 사전을 볼 것이고 나는이 사전을 볼 것이다 카드 가져 오기 이모티콘을 선택한 다음 카드 (표현식)를 가져옵니다 우리는 선택된 표현 인 chooseEmoji를 할당합니다 다음은 사전에서 뭔가를 찾는 방법입니다

당신은 말한다 그렇다면 이것은 사전을 찾는 문법입니다 사전의 이름, 대괄호, 사전의 이름, 왼쪽 대괄호 당신이 바라보고 싶은 것입니다 그리고 이것은 int가 좋을 것입니다 그리고 나서, 사용 된 키를 찾으십시오 여기서 Int 타입이 좋습니다

사전이기 때문에 찾는 사전이기 때문에 찾고 있습니다 Ints 및 다시 문자열을 제공하고 이것은 Int 유형의 키일 것입니다 그리고 String 유형의 값을 반환합니다 만약 내가 alt-click하면 이것을 option-click하면 문자열이된다 alt / option을 클릭하면 그것은 문자열이 될 것인가? 분명히 그렇지 않거나, 그 유형이 String이 아닌가? 틀림없이, 그렇지 않으면 나는하지 않을 것이다

그 질문을 해보십시오이 선택된 그림이 무엇인지 보도록하겠습니다이 질문을하십시오 ChooseEmoji가 어떤 유형인지 보자 당신은 그것이 문자열 일 것이라고 생각합니다, 오, 그게 뭐죠? 당신은 그것이 String 일 것이라고 생각합니까? 그렇다고 생각합니까? 유형은, 누군가는 벤처하고 싶다, 나는 거기 밖으로 들렸다 그것은 어떤 유형이다, 대담한 말? 들었어

속삭이고 선택적이며, 옵션을 반환합니다 왜 선택적 유형인지 속삭여지며, 선택적 유형을 반환합니다 왜 String을 반환하는 대신에 옵션을 돌려주는 것? Well of String은 문자열을 반환하지만 대신 선택적 형식을 반환합니다 선택 사항? 물론, 우리가 사전에서 뭔가를 볼 때, 물론, 우리가 사전을 보았 기 때문에 안에 있지 않을 수도 있습니다 우리가 찾은 것은 그곳에있는 것이 아니라 우리가 찾고있는 열쇠가 반드시 사전에있는 것은 아닙니다

만약 거기에 없다면 우리는 돌아 가지 않을 것입니다 안쪽에 있지 않으면 우리는 기본값을 얻을 것입니다 옵션은 설정되지 않습니다 거기에 있으면 빈 옵션 타입을 얻습니다 내부에 있다면, 우리는 얻을 것이다

선택적 세트이며, 값을 갖는 선택적 유형으로 문자열이 될 것이므로, 다음과 같이 String 문자열이 있습니다 관련 값, 물론 문자열은 관련 값에 포함되어 있습니다 물론 String은 사전에 있기 때문에 사전, 모두들, 그걸 이해하십시오 가치의 유형 모두가 이해할 필요가있다 사전에있는 내용은 선택 사항을 반환합니다

사전에서 찾을 때 선택적 유형을 반환합니다 그건 그렇고,이 사전을 참조하십시오 <Int, String> 우리는 특별한 배열 구문을 어떻게 가지고 있는지 알고 있습니다 특별한 구문 설탕의 배열을 기억합니까? 대괄호를 열고 배열에 입력하십시오 우리는 사전에 대해 똑같은 것을 가지고 있습니다 같은 사전에도 구문 설탕이 있습니다

이 모양은 열린 대괄호입니다이 모양은 왼쪽 대괄호입니다 열린 대괄호, 키, 왼쪽 대괄호, 키 유형 콜론, 값 유형입니다 즉, 콜론, 값 유형 (오른쪽 대괄호)입니다 이처럼 사전과 문자열은 우리가 가장 많이 사용하는 것들이며, 사전과 문자열 (및 배열)은 우리가 가장 많이 사용하는 것들입니다

우리가 사용하는 데이터 구조 그래서 우리는 데이터 구조를위한 특별한 문법을 ​​가지고 있습니다, 그래서 우리는 특별한 통사론을 가지고 있습니다 둘 다, 그래서 그것은 사전의 선언입니다 그래서 이것은 사전을 정의하는 방법입니다 그것은 방금 방금 낸 물건과 똑같습니다 이것은 제가 대체 한 것과 같습니다

사전, int, 문자열 Dictionary <Int, String> 우리는 이것이 우리가 알기 때문에 우리가 할 수있는만큼 돌아 오는 것을 알기 때문에 할 수 있습니다 이 것은 선택 사항입니다 여기에 넣으면 할 수 있습니다 그러나 이것은 선택적 유형입니다 if-let을 사용할 수는 있지만 선택 사항을 다루는 다른 방법을 보여 드리겠습니다

따라서 선택적 유형을 처리하는 다른 방법을 보여 드리고자합니다 당신은 우리가 확실히 당신이 느낌표를 사용하는 방법을 알고 느낌표를 수행하는 방법을 알고 있지만, 확실히 우리는 여기에 있습니다 여기에서하고 싶지 않아요 예를 들어, 이것을 원하지 않기 때문에, 예를 들어, 이 사전은 비어 있습니다 그래서 느낌표를 쓰는 경우이 사전은 느낌표를 사용하면 처음에는 비어 있습니다 여기 포인트, 그 안 좋네요 있도록거야 충돌 그것은 당신이 프로그램을 실행할 때마다 충돌합니다

때마다, 그래서이 충분하지 않습니다 그리고 그 안전 할 것, 할 수 있다면 우리는 할 수 있지만, 그것은 안전합니다 허락한다면 – 우리가 사용할 수있는거야,하지만 난 우리가 자주 다른 것을 보여줄 무언가를 다루는 또 다른 방법을 보여줍니다 우리는 종종 당신을 다루기 위해 그것을 사용합니다 선택의 여지가 있습니다 우리는 단지 확인하기 만 할 것인가, 선택적인 유형의 가치 일지, 우리가 본 것입니다 이 것이 nil과 같지 않으면 nil이 아닌 느낌표를 사용할 수 있습니다

그러면 느낌표를 사용할 수 있습니다 그것을 지적하십시오 나는이 느낌표를 되돌릴 수 있고 그것을 풀어 주도록 강요 할 수 있습니다 느낌표와 함께 이것을 돌려 줄 수 있습니다 내가이이 전무되지 않도록 확인 되었기 때문에 전무 첫째

이것은, 안전 나는 그것이 아니다 있는지 확인하기 위해 검사하기 때문에 안전 그래서 그것은 옵션을 다루는 또 다른 방법입니다 그냥 확인하십시오 그래서 이것은 우리가 선택적 타입을 처리하는 또 다른 방법입니다, 그냥 판사 그것이 0이 아닌지 확인하고, 0이 아닌지 확인하십시오 그런 다음 느낌표를 표시하고 다른 느낌표를 사용하여 느낌표를 사용하여 포장을 푸십시오 그렇지 않으면 사전에서 이모티콘을 찾을 수 없다면 사전에서이 표현을 찾을 수 없다면 우리는 생각할 것입니다

그냥 물음표를 반환하십시오 그래서 우리는 좀 포기하고 물음표를 반환 할 것입니다 우리는 시도를 포기합니다 물음표 만 표시하면 이제는이 코드가 너무 일반적이어서 물음표가 표시됩니다 사실,이 코드는 매우 일반적입니다

선택적 요소를 얻고 선택적 형식을 얻으려면 if 다음은, 만약 그렇지 않으면, 디폴트 값을 관련 값을 사용하여 그렇지 않은 경우이 설정되어있는 경우, 다음을 사용합니다 그러나이 설정되어 있지 않은 경우, 그것은 비어 있지 이와 같이 잘 정의 된 다른 작업을 수행하십시오 그러나이 물음표와 같은 다른 값을 사용할 수 있습니다 그래서 이걸 할 수 있어요 이것을 특수 연산자로 작성하면 다음과 같습니다

다른 특수 연산자는 다음과 같습니다 돌아오고, 돌아와, 이거 바로 여기 이걸로 돌려줘 그러나 물음표, 물음표, nil 인 경우 ?? 연산자를 사용하십시오 다른 것을 돌려 주라

이것은 반환하지만 다른 기본값을 반환한다 값이 있으면 반환하고 그렇지 않으면 반환합니다 그것은 아무것도 반환하지 않는 경우이 있습니다 매우 일반적인, 그것은 nil 다음 반환이 매우 일반적인 정확히 이것과 똑같은 코드입니다 그래서 똑같은 코드입니다

우리는 그것을 필요로하지 않습니다 모든 사람들은 그 구문을 가지고 있습니다 우리는 코드를 필요로하지 않으며, 모든 사람들이이 문법을 이해합니까? 이렇게하는 것이 매우 일반적이므로이를 달성하기 위해 열심히 찾고 있습니다 매우 일반적이어서 우리는 부드럽게 이모티콘 사전에서 카드 식별자를 올리고 카드의 식별자로 이모티콘 사전을 찾습니다 이모티콘을 돌려 주시길 바랍니다

하지만 우리는 아무것도 쓰지 않았고 표현을 반환하는 것이 가장 좋습니다하지만 우리는 그것을 넣지 않았습니다 그 사전에, 항상 질문을 반환 할 것입니다 아무 것도 그 사전에갑니다 그래서 항상 물음표를 반환합니다

Mark, 사전에 어떤 것을 넣을 수 있습니까? 그렇다면 키 – 값 쌍을 사전에 어떻게 추가할까요? 요구에 따라 사전에 넣을 것이고 필요할 때 사전에 추가 할 것입니다 그들이 사용되기 때문에 누군가가 나에게 묻고 나서 그들을 넣을 때마다 그래서 누군가 나에게 묻기 때문에 카드의 그림 이모티콘을 통해 카드 표현을 확인하고 제공 할 예정입니다 이 카드에 대한 이모티가 현재 없으면이 카드의 그림이없는 경우 그때 야 그 카드에 대한 사전에서 이모티콘을 넣어 해요 내가 사전에 버튼에 해당하는 얼굴 표정을 선택할 수 있습니다 그래서 저는이 사전을로드하는 중입니다

사전을 제 시간에 준비 할 것입니다 자, 어떻게 할까? 이것들 중 하나를 택할거야, 내가 뭘해야 해? 나는 그들 중 하나를 선택할 필요가있다 무작위로이 사전에 넣으므로, 하나를 선택하여 사전에 넣으면 생성됩니다 임의의 인덱스입니다 randomIndex를 임의의 인덱스와 동일하게 할 것입니다

임의의 인덱스에 randomIndex를 할당하고 싶습니다 이 멋진 Swift 함수를 사용하겠다 Swift에서 멋진 함수를 사용하고 싶다 Arc4random_uniform 함수입니다 따라서 arc4random_uniform은 의사 난수입니다

arc4random_uniform은 의사 난수입니다 Generator를 사용하고 생성자와 생성자 사이의 임의의 숫자를 생성합니다 생성자는 0에서 임의의 숫자를 생성합니다 이 상한 __upper_bound,이 상한, __upper_bound 사이의 임의의 숫자가 표시되는지 확인하십시오

어떤 부호없는 정수, 32 비트 정수입니다 이것은 UInt32, 부호없는 32 비트 정수입니다 0과 그 사이의 임의의 숫자를 생성하며, 0과 상한 사이의 난수를 생성합니다 그 번호를 포함하지 않습니다 정확히 원하는 것입니다,하지만 상한을 포함하지 않습니다

그리고이게 내가 원하는거야 상한이있는 경우,이 배열에 몇 개의 요소가 있는가? 상한은이 배열에 몇 개의 요소가 있는가? 왜냐하면 0에서이 배열을 색인하기를 원하기 때문입니다 그러나 많은 것들이 배열에서 1을 뺀 것입니다 그래서 여기에서는 배열 요소의 수에서 간격의 한 부분을 뺀 것입니다 상한이므로이 상한 emojiChoices

count를 사용합니다 지금은 훌륭하지만 작동하지 않습니다 오류가 발생했습니다 괜찮습니다 그러나 직접적으로 사용될 수는 없습니다

오류가 발생했습니다 오류가 무엇을 말합니까? 그것은 가치를 변환 할 수 없다고 말합니다 오류가 무엇을 말 했습니까? 그것은 그것이 변환 될 수 없다고 말합니다 예기치 않은 인수 유형에 int 유형이 있습니다 unsigned 32 비트 Int 유형은 필수입니다

UInt32 유형 int arc4random은 부호없는 int만으로 작동합니다 즉, arc4random_uniform은 부호없는 정수만 사용할 수 있습니다 이 배열의 개수는 int이며 unsigned int가 아니며이 배열의 개수는 Int이며 부호없는 UInt가 아닙니다 Swift는 절대로 자동 유형 변환을 수행하지 않습니다 그것은 결코 자동으로 unsigned로 변환되지 않으며 서명 된 int를 부호없는 정수로 변환하지 않습니다

from을 double로 변환하고 double로 변환하면 명시 적으로 변환해야합니다 그리고 어떻게 스위프트에서 타입을 변환합니까? 스위프트에서 어떻게 타입을 변환합니까? 이것이 내가 너에게 보여주고있는 이유 다 그래서 내가 너에게 이것을 보여주고 싶다 Swift에서 유형을 변환하는 방법을 알 수 있으므로 Swift에서 유형을 변환하는 방법을 알 수 있습니다 새로운 것을 만들어야하고 새로운 유형의 인스턴스를 만들고 싶습니다

그 새로운 것을 초기화 할 때 이니셜 라이저를 사용하십시오 그래서 그 타입의 생성자로 생성 될 것입니다 여기에, 나는 내가 그 다음, UINT32, 부호없는 INT (32)가 그래서 나는 UINT32, 부호없는 32 비트 정수를 만들려면, 여기가를 만들 싶어 다행히 UInt32의 생성자를 사용하여 UInt32를 생성하십시오 다행히도 다만 INT, UINT32, 또한 UINT32 지능과 같은 구조체가 방법에 의해,이다 UINT32는 구조와 동일 문자열과 마찬가지로 배열과 마찬가지로 사전과 마찬가지로 String 문자열, 배열 배열, 사전 사전과 같습니다 카드와 마찬가지로, 이것들은 모두 구조체이며 카드 카드와 같습니다

UInt32에는 int 인수를 갖는 생성자가 있습니다 정확히 내가 원하는, 알았지? 그래서 내가 원하는 정확히하여 UINT32를 만들 수 있습니다, 그래서 UINT32 건설 int emojiChoices를 전달합니다 emojiChoicescount를 지정하면이 정수가됩니다 이것이 바로 여기서 바로이 해결책을 제시하는 이유입니다

이것이 여기서 제안한 해결책입니다 그래서 내가 할거야, 고쳐 줘, 그게 뭔지 알 겠어? UInt32, 그래서이 픽스를 주문할거야 그것이 무엇을 참조하십시오? UInt32 괄호를 엽니 다 init에 대한 인수는 Int입니다 이 생성자에 대한 인수는 Int 유형입니다

그 방법을 알고 있습니다 지금은 아직 없습니다 변환 방법을 알고 있습니다 그러나 아직 끝나지 않았다 여기서 반환 값을 보면 randomIndex입니다

반환 값을 살펴볼 것이므로이 randomIndex 또한 부호없는 정수이기 때문에 좋지 않습니다 부호없는 정수이기도하며 좋지 않습니다 왜냐하면이 배열의 인덱스로 사용하기를 원하기 때문입니다 우리는 인덱스가 부호없는 정수가 아니라는 것을 알고 있습니다 인덱스는 부호없는 정수가 아닙니다

그들은 int라고 생각하지만, 이론적으로는 부정적이지는 않지만 Int 형입니다 대부분 이전 버전과의 호환성 문제 때문입니다 이전 버전과의 호환성을 위해 있어야합니다 그래서이 모든 것을 int로 변환해야합니다 다행히도, Int로 변환해야합니다

다행히도 Int 부호없는 int를 취하는 이니셜 라이저가 있고 Int에는 부호없는 정수를 허용하는 생성자가 있습니다 좋아, 이제 여기에 임의의 인덱스가있다 그런 다음 Int로 변환한다 좋아, 지금 무작위 색인이있어 그것은 int이며,이 배열로 색인하기에 적합합니다

배열을 색인하는 데 사용할 수있는 Int입니다 그것은 임의의 색인입니다 그래서 그것을 얻으려면 이모티를 말할 수 있습니다 여기에 임의의 색인이 있습니다 그럼이 표현식을 가져와 사용할 수 있습니다

Sub cardidentifier 이제는 사전에 무엇인가 넣으십시오 emoji [cardidentifer]

그 값을 사전에 넣어야합니다 Emoji, 그냥 = 뒤에 원하는 값을 입력하십시오 즉, 선택, 하위, 무작위, 색인하지만 나는 그렇지 않습니다이 아이콘은 [emojiChoice] [randomIndex]가 아닙니다

하지만 나는 이것이 완벽하지 않다고 생각하지 않는다 내가 할 일은 일종의 일이 될거야 내가하고 싶은 일이다 어떤 의미에서는 사용할 수 있습니다 유일한 문제는 두 개의 식별자를 얻을 수 있지만이 문제는 두 개의 다른 식별자를 얻을 수 있다는 것입니다

동일한 그림 이모티콘을 사용합니다 따라서 잡기 대신 배열에서 가져온 것과 동일한 표현을 사용합니다 여기 뭔가, 내가 그것을 제거 할거야 좋아, 내가 그 표현을 사용할 때, 나는 그 표현을 제거 할 것이다 내가 사용할 때 이모티스 중 하나인데, 여기에서 제거하려고합니다

그래서 여기에서 제거하겠습니다 나는 그것을 다시 사용하지 않는다 그래서 그것을하기 위해, 나는 사용할 것이므로, 나는 그것을 다시 사용하지 않을 것이다 그렇다면, 나는 배열 subscripting 대신 subscripting을 호출하는 것보다 배열에 다른 방법이 있는데, 다른 방법을 사용합니다 에서 제거하십시오

그리고 난 그냥 무작위 색인에서 제거 거 야 remove (at :), 나는 randomIndex에서 식을 제거합니다 그래서 at을 제거하면 제거 된 것이므로 remove (at 🙂 메서드는 제거 된 요소를 반환하므로 제거됩니다 이 emojis 중 하나를 여기에서 선택하여 반환하십시오 여기에서 표현 중 하나를 제거하고 다시 반환하십시오

그리고 나는 그것을 사전에 넣을 것입니다 모두들 그걸 사전에 추가했습니다 이해하니? 그게 지금은 다른 건 하나 뿐이야 그럼 우리는 여전히 emojiChoicescount가 0 인 경우는 무엇입니까? emojiChoices

count가 0 인 경우 즉, 내가 이모티콘을 모두 사용하면 어떻게됩니까? 즉, 모든 표현을 다 써 버렸습니다 emojiChoices에서 나는 그들을 모두 꺼내 봤어? 내가 이모티콘의 모든 것을 제거하면 어떨까요? 문제가 생길 것 같습니다 arc4random은 문제가 될 수 없습니다 Arc4random_uniform은 할 수 없다 이 0 매개 변수로 받아 들인다 1

마이너스 그 숫자 0에서가는 있기 때문에 0을 뺀 매개 변수 사이의 숫자를 반환하기 때문에, 영을 그리고 그것은 unsigned int이므로 음수가 될 수 없습니다 그리고 부호없는 정수이기 때문에 음수 일 수 없습니다 그래서 우리는 그 사건으로부터 보호해야 할 것입니다 그래서 우리는이 상황을 피해야합니다 그럼 이모지를 말 할거 죠

선택합니다 그래서 이모티콘을 판단합니다 선택 0보다 크면 잡을 수 있습니다 0보다 크면 제거 할 수 있습니다 거기서 나오는 이모티콘을 사용하십시오

하지만 내부 표현 중 하나를 사용한다면 그것이 동일한의 경우 0 나는이 작업을 수행 할 수없는, 그 이하입니다 제로보다 작은 경우, 나는이 싫어 그리고 나는 물음표를 여기에 붙였습니다 방법 스위프트의 시원한 일, 당신은 우리가 다시 어떻게 볼 수 있습니다 그건 그렇고, 스위프트는 우리를 여기서 볼 수있는 멋진 장소입니다 Back ifs here

같은 두 개의 인접한 if 문에 back if backs를 넣을 수 있습니다 둘을 한 줄로 병합 할 수 있습니다 선을 쉼표로 구분하면됩니다 쉼표를 사용하여 if 판단을 구분하십시오 그렇다면 거기에 포함 된 if가 필요하지 않으므로 if 문을 중첩 할 필요가 없습니다

특히 상황과 관련이있을 때 특히 좋습니다 두 if 문이 관련되어있을 때 매우 좋습니다 그것을 봐라 이 줄 바꿈 코드가 읽는 방법이 줄의 코드에 대한 그림이 너무 명확한 경우 해당 표현이 이 카드 식별자가 설정되지 않았으며이 카드 식별자의 표현식이 존재하지 않으며 우리가 emojiChoices이있는 경우 하나를 얻을, 다음 모든 권리, 이동? 우리는 여전히 얼굴을 선택할 수 있습니다, 다음 가서, 그렇지? 좋아, 그럼이게 효과가 있는지 보자 가자

실행 해 보자 이걸 사용할 수 있는지 보자 실행하자 우리가 무작위로 이모티콘을 잡아서 퍼팅하고 있는지 확인해보십시오 4 장의 카드 중 하나에 있습니다

그런데 4 장의 카드에는 의사 난수입니다 그건 그렇고, 이것은 의사 난수입니다 그래서 당신은 슈퍼 랜덤하지 않다는 것을 알게 될 것입니다 그래서 당신은 그것이 매우 임의적이지는 않다는 것을 알게 될 것입니다 하지만 어쨌든, 알았어, 보자

하지만 그를 돌봐 좋아, 한번 보자 오, 그래, 우린 무작위로 그림이 생겼어 오, 또 다른 무언가가있어 우린 무작위로 표현했다

오, 이건 또 다른거야 작은 사탕, 잘하면이 두 개는 동일합니다 예 좋아요, 사탕입니다 이 둘이 같기를 바랍니다

예! 좋은 그래서 그것은 작동 중입니다 좋아요 식별자로 찾았습니다 프로그램을 사용할 수 있습니다 식별자를 사전에 전달합니다

그림 이모티콘을 선택하고 해당 식별자에 대해 해당 그림 이모티콘을 사용하면 표현식을 찾은 다음 그 표현식을 모든 식별자에 표시합니다 모든 카드에서 그리고 무작위 적이다 다시 그만하자 무작위인지 확인하려면 다시 시도해주세요

그래서 우리는 악마 녀석과 사탕을 여기에 가지고 있습니다 우리는 악마와 과자입니다 의사 난수 생성기가 수행하는 손가락을 교차 시키면 의사 난수 생성기가 정상이 될 것으로 예상됩니다 어디 보자 오, 악마 녀석, 고양이 잡았어

한번 보자 오,이게 악마 야 오,이 고양이 야 무서워하는 고양이, 그게 뭐든, 비명을 지르는 고양이 그래서 겁 먹은 고양이, 비명 고양이 우리는 무작위로 얻고 있습니다, 이것은 작동하는 것처럼 보입니다

그래서 무작위로 얻습니다 따라서 여기에 UI가 완벽하게 기능합니다 따라서 UI가 제대로 작동하고 있습니다 그래서 지금해야 할 유일한 일은 이 일을 집중력으로 만들어서 실제로 플럽 게임을하게하십시오 그건 순수하게 모델 일입니다

그래서 모델을 완전히 책임지게 만드는 것입니다 그 작업을 제가 모델을 가져올 것입니다 그리고 이것을 달성하기 위해 우리는 모델을 보여줍니다 모델에 코드를 추가하겠습니다 모델에 코드 만 추가합니다

지금은 카드를 뒤집어 놓습니다 이제 그 카드를 뒤집어 버릴 것입니다 대신 우리는 게임을 플레이하게하고, 대신이 게임을 플레이하게하십시오 이 구현의 일환으로, 나는 선택 사항을 사용할 것이고, 그 중 하나는 옵션 유형을 사용할 것이다 왜냐하면 나는 너를 모두 알고 있기 때문에 너는 아직도 모두를 제외하고 있다는 것을 알기 때문에

이 위대한 질문을 던진이 녀석 당신은 여전히 ​​그렇지 않습니다 좋은 질문을 한이 동급생은별로 아닙니다 확실히 나는 선택적인 것을 이해한다 그래서 여기에 기회가 있습니다

선택 사항을 사용할 것입니다 따라서 이것은 선택 사항 유형의 예제입니다 기본 의미 체계 구현의 일부로 선택적 유형으로이 메소드의 기본 의미를 구현합니다 이 방법에 대해 알아 보겠습니다 시작하겠습니다

카드를 선택했을 때 가장 먼저 할 일은 카드를 선택한 후 제일 먼저 할 일입니다 이미 맞춰진 카드를 무시할 것입니다 그래서 페어링 된 카드를 무시해야합니다 이미 데스크톱을 선택한 경우 이미 보드에있는 카드를 선택하면 다른 카드와 일치하면 무시할 것입니다 따라서 다른 카드와 쌍을 이루면 직접 무시할 것입니다

나는거야 말거야 만약 내가 판단 그래서 만약 당신이, 인덱스 카드를 선택한 카드 선택된 카드의 경우, 카드 인덱스 지수 카드 그렇다면 나는 이것을하지 않을 것입니다 그렇다면, 일치하면, 아무것도하지 않을 것입니다 나는 그것이 일치하지 않는다고 말할 것이고, 그렇게한다면, 그렇게해야한다 그래서 나는 짝짓기가 없는지를 판단해야한다 그리고 나서해라

그것이 일치하면 다음을 수행하지 마십시오이 노치는 일치하는 경우 수행하지 마십시오 이 느낌표 다른 언어와 마찬가지로 반대는 다른 언어와 마찬가지로 "비"를 의미하고, 반대는 이 Bool 나는 모든 일치하는 카드를 무시할거야 부울

페어링 된 모든 카드를 무시합니다 이제 어떻게해야하지? 세 건의 사례가 있네 지금 내가 뭘하고 있니? 이제 세 가지 경우가 있습니다 카드가 보이지 않으면 카드가 나오지 않을 수 있습니다 먼저 카드가 보이지 않습니다

카드가없는 경우 카드를 선택했을 때 앞면이 위로 뒤집어 져 있습니다 카드를 뒤집어서 카드를 뒤집어 놓았습니다 그게 전부입니다 또 다른 옵션은 두 카드입니다 얼굴 이것은 무엇을 할 수있다 또 다른 가능성은 두 장의 카드가 위를 향하고 있다는 것입니다

일치, 또는 일치하지 않음 일치하는 경우 페어링이 페어링되지 않을 수 있습니다 이 경우 다른 카드를 선택하면 그 카드를 뒤집어 야합니다 다른 카드를 선택하면이 두 카드를 만들어야합니다 내게 새로운 시합을 시작하겠습니다

세 번째 옵션은 새로운 페어링 라운드를 시작할 것이므로 아래로 향하게됩니다 세 번째 가능성은 한 장의 카드가 보이고 다른 카드를 선택합니다 카드가 보이면 다른 카드를 선택했습니다 이제 일치해야합니다 일치하는지 확인해야합니다

이제 일치하는지 확인해야합니다 그래서 그것들은 세 가지 옵션입니다 그래서 저는 원합니다, 그래서 이것들은 세 가지 상황입니다 하나의 카드가있는 옵션을 실제로 추적하십시오 그것이 내가 실제로해야 할 일이기 때문에 위로 향하게하십시오

내가 실제로 추가 작업을해야하기 때문에 위로 향하십시오 나는 그들이 일치하는지 시험해야만한다 그래서 나는 그것이 쌍을 이루는지를 알아봐야 할 필요가있다 하나가 있다면 트랙을 유지하기 위해 var를 생성 할 것이고 변수 레코드가 있다면 변수 레코드를 만들고 싶을 것입니다 카드 하나만 앞면이 위로 향하게하고 카드 하나만 위로 향하게합니다

나는 내가 그것을 호출 indexOfOneAndOnlyFaceUpCard 호출하는거야 indexOfOneAndOnlyFaceUpCard 그리고 물론 그것의 인덱스는 int가 될 것입니다 인덱스이기 때문에 당연히 Int 타입입니다 이제 뭐죠 indexOfOneAndOnlyFaceUpCard의 값이 값 indexOfOneAndOnlyFaceUpCard 만약에? 어떤 카드도 앞면이 위로 향하지 않습니다 카드가 2 장이라면 어떤 가치가 있습니까? 두 카드가 위를 향한 경우 카드가 보이지? 흥미 롭군요, 그 가치는 뭔가요? 매우 흥미로운 이것이 선택 사항이되고 싶다고 생각합니다 이유는 이것이 선택적 유형으로 정의되어야한다고 생각하기 때문입니다

왜 그런지 알기 때문입니다 하나의 색인이 하나도없고 두 가지 경우 모두에 하나의 상향 카드 만 갖고있는 경우 오직 얼굴 카드, 그리고 이것이 설정되지 않을 것입니다, 색인, 그래서 이것이 기본값이 될 것입니다 얼굴 카드가 하나 밖에 없기 때문에 단일 카드가 위를 향하지 않기 때문에 여기에 선택자를 많이 사용합니다 그래서 항상 옵션 유형을 사용하기에 좋은 곳입니다 그래서 언제든지 내 게임, 카드가 하나 밖에없는 경우,이 게임에는 카드가 하나뿐입니다

내게 그것의 색인을 말해서 나는 그것에 맞설 수있다 색인을 말해 주겠다 그리고 다른 모든 시간은 이것이 제로가 될 것입니다 나는 어떤 일도 할 필요가 없다 나는 일을 할 필요가 없다는 것을 알 필요가 없다

나는 필요 없다 페어링을 시도하기 위해 일치시킬 카드가 없기 때문에 일치하는 카드를 사용할 수 없기 때문에 일치하는 카드를 찾으십시오 그렇다면이 코드를 사용하는 코드는 무엇입니까? 사용하는 코드는 어떻게 생겼습니까? 나는 match index를 만들 수 있는지를 판단 할 것입니다 어떤 로컬 변수이며,이 인덱스는 1이고이 로컬 변수는 indexOfOneAndOnlyFaceUpCard에 할당됩니다 카드를 앞면이 위로 향하게 한 다음, 여기에이 카드가 있어야합니다

그런 다음 일치시킬 대상이 있습니다 그건 그렇고, 나는 그 일치하는 것을 확인하고 싶다 그런데, 그 쌍을 확실히하고 싶다 해당 항목의 색인이 선택한 카드와 동일하지 않습니다 카드 색인과 선택한 카드가 다릅니다

오직 하나만 있다면, 오직 하나만 있다면, 그리고 오직 하나만 있다면 카드의 한 면만 선택하고 그 카드를 선택한 상태에서 한 장만 선택하면 다시 선택합니다 그것을 무시할 것입니다 당신은 다른 것을 선택해야합니다 다른 것을 고르셔야합니다 여기이 중괄호 안에있는 것은 카드입니다

한 쌍의 중괄호에서는 카드가 맞는지 확인하고 바깥 쪽은 무엇입니까? 카드가 페어링되어 있는지 확인하십시오 밖에서? 카드가 없거나 카드가 없습니다 두 장의 카드가 앞면이 보이므로 일치시킬 수 없습니다 두 장의 카드가 위를 향하게되어 있으므로 일치시킬 수 없습니다 이 경우 카드를 뒤집어서 카드를 뒤쪽으로 돌려야합니다

선택한 카드가 앞면이 위로 향한 유일한 카드가됩니다 그러면 선택한 카드가 유일한 카드가됩니다 그리고 나서 인덱스의 인덱스로 설정 한 다음 indexOfOneAndOnlyFaceUpCard에 할당합니다 카드를 앞면이 위를 향하게하십시오 모든 것을합시다 카드가 맞는지 확인해 봅시다

시작하겠습니다 먼저 카드가 페어링되었는지 확인하십시오 카드가 색인과 일치하면 정말 쉽습니다 쌍을 이루는 카드의 식별자가 매우 간단합니다 선택한 카드의 카드와 같습니다

이것은 선택 카드가 선택한 카드의 식별자와 같고, index는 chooseCard 내부의 기능입니다 색인에요, 일치하면 일치하는 것으로 표시 할게요 일치하면 성공한 것으로 표시합니다 일치 색인의 카드가 일치하고 일치시킬 카드가 일치하도록 수정됩니다 선택한 카드가 일치합니다

선택한 카드도 성공적으로 일치합니다 그래서 나는 그들을 멋지게 매치 시켰습니다 일치하지 않아도, 일치한다면, 훌륭합니다 일치하지 않으면 지금 두 번째 카드를 선택하면 어떻게됩니까? 두 번째 카드를 선택하면 어떻게됩니까? 상황이 발생했습니다 하나는 내가 선택한 카드를 뒤집어 야합니다

두 가지 일이 발생합니다 우선, 선택한 카드를 앞쪽으로 돌립니다 당신이 선택한 카드가 아래쪽에 있었기 때문에 당신은 그 카드를 뒤집어서 선택했습니다 카드 하위 인덱스는 그 카드를 쓸거야 위로 향한 얼굴은 사실입니다, 당신이 선택한 카드 때문에 isFaceUp 속성은 확실합니다 나는 그것을 물론 뒤집어 놓고있다 그리고 2 번 그리고 물론 그것을 앞쪽으로 돌릴 것이다 둘째 가장 중요한 것은 오직 하나의 얼굴 위로 향한 카드의 인덱스 또한 가장 중요합니다, indexOfOneAndOnlyFaceUpCard 현재 두 개의 일치하는 카드가 있기 때문에 값이 nil입니다

이제 두 개의 일치하는 카드가 있기 때문입니다 2 개, 매치 또는 타의 추종을 불허하는 카드, 2 장의 페이스 업 카드 아니, 2 매칭 또는 타의 추종을 불허하는 페이스 업 카드 카드가 하나 밖에 없으므로 아무 것도 없으므로 하나의 카드 만 위로 향하게하지 마십시오 그래서 그 값은 무효입니다 선택 사항을 nil로 설정하는 것이 완벽하게 합법적이므로, 옵션 유형 값을 nil로 설정하면 완전히 유효합니다

카드가 일치하면 우리가해야 할 일이 모두 있습니다 그게 바로 카드가 로직과 일치 할 때해야 할 모든 논리입니다 이제 여기에 카드가 없거나 카드가 보이지 않습니다 두 장의 카드가 위로 향하게됩니다이 경우 두 장의 카드가 위로 향하게됩니다

이 경우 나는 모든 카드를 뒤집어 놓을거야 이제 그들은 이미 모든 카드를 뒤쪽으로 돌릴지도 모른다 그들은 이미 가지고 있을지도 모른다 모두 얼굴을 아래로 내려 놓았으나 약간의 낭비 일뿐입니다 모두 뒤에서 뒤졌지만 약간의 추가 작업이있었습니다 나는 플립 다운 인덱스를 위해서 갈거야, 뭐야? 플립 다운 인 덱스를 써야 해

내 카드의 색인에 카드 색인, 카드 색인 카드의 색인 속성 그게 전부에요, 그건 셀 수없는 범위입니다

기억하세요, 그것은 Countable Range입니다, 기억하나요? 이것은 모든 색인의 바로 여기에 셀 수있는 범위입니다 CountableRange이고, 범위는입니다 뒤집기 중, 내 카드에 그래서 각 카드마다 내 모든 카드 모든 카드마다 나는 거짓 flipDownIndex

isFaceup =에서 카드를 말하는거야거야 내가 건물에 위치한 flipDownIndex을 isFaceUp 쓸 것 그 카드가 false의 방금 보드의 모든 단일 카드를 뒤집어 놓았습니다 방금 데스크탑의 모든 카드를 뒤쪽으로 돌 렸습니다 하지만 이제는 카드를 선택 했으므로 그 카드를 돌릴 것입니다하지만 카드를 선택 했으므로 선택한 카드를 가져 가겠습니다

isFaceUp = true로 정면으로 향했고, isFaceUp을 true로 설정했습니다 물론 모든 카드를 뒤집어 놓았 기 때문에 물론 모든 카드를 뒷면으로 돌 렸기 때문에 하나의 인덱스입니다 만 카드를 넣어 긍정적, 다음 indexOfOneAndOnlyFaceUp을 켜 무엇을 하나의 카드가 직면 설정 방금 그 카드의 가치는 무엇입니까? 이 색인입니다 방금 가져 왔어 위의 카드는 정의에 따라 유일한 카드입니다 카드를 앞면으로 돌려 놓으십시오

이 신사 숙녀 여러분, 우리가 무엇을 얻었습니까? 오 이런 우리가 지금 무엇을 얻었습니까? 오, 여기 있어야 해 cardsindexidentifier는 식별자를 비교해야합니까? cards [index] identifier는 해당 식별자를 비교합니다 이것은 집중 게임 로직의 전반적인 것이며, 이것은 플럽 게임의 전체 로직입니다

필요한 모든 것입니다 바로 그 것입니다 이것이 필요한 모든 논리입니다 이 옵션을 사용하면 옵션 유형을 전달하는 방법을 볼 수 있습니다 바로 여기에서 좀 더 간단하고 간단하게 만들었습니까? 전체 논리는 매우 간단하고 간단합니까? 나를 위해 원하는 카드를 추적하기가 쉽기 때문에 일치시키고 자하는 카드를 배치하면 항상 일치합니다

항상 일치하고 매우 간단합니다 그리고 나를 위해서 그 카드와 일치하는 카드가 있는지 또는 여기에 맞는 카드가 있는지 판별하는 것은 간단합니다 모든 것이 하나의 작은 변수에 포함되어 있습니다 모든 논리는 작은 변수에 포함되어 있습니다 그것이 정보입니다

바로 그 것입니다, 우리가 너무 많은 정보를 가지고 있는지 보러 가자 이것은 그 것이다 만약 우리가 보자 응용 프로그램이 작동 중입니다 그냥 작동해야합니다

일단 응용 프로그램을 실행할 수있게 만들면됩니다 그것은 작동해야한다, 일단 당신이 그것을 끝내면 의미한다 모델은 UI가하는 일을 신경 쓰지 않습니다 모델은 그것이해야하는 것을 구현하고, UI는 상관하지 않습니다 모델의 내용을 보여 주기만하면되므로 모델의 내용을 보여주기 때문에 그냥 작동해야합니다

그래서 여기서 시도해보십시오 좋아, 잘 작동 할 것입니다 그것을 시도하자 우리가이있어, 고양이가, 아, 비명 얼굴 음, 우리가 가진이, 고양이, 오, 어디 비명 얼굴이있다 이제 다른 카드를 클릭하면 어떻게됩니까? 다른 카드를 클릭하면 어떻게됩니까? 모든 카드를 앞면이 뒤집어 져야합니다

모든 카드를 뒷면으로 뒤집어 놓아야합니다 일치하지 않으므로 일치하지 않으므로 일치하지 않으므로 일치하지 않습니다 이 모든면을 아래로 뒤집어서 새 카드를 뒤집어서 모든 카드를 뒤쪽으로 돌리십시오 새 카드를 넣으십시오 이제 선택 사항이 설정 될 것이므로 앞쪽으로 돌리면 선택적 유형은 값을 갖게됩니다

그것을 시도해 보도록합시다 완전히 뒤집어서 시도해 봅시다 물론 그것은 그것들 모두를 뒤쪽으로 돌렸다 이 게임을 선택하면 일치하는 게임을 선택하면 어떻게됩니까? 일치하는 카드를 선택하면 어떻게됩니까? 이제 그들은 둘 다 일치하는 것으로 표시되었습니다 이제 다음번에는 성공적인 일치로 표시됩니다

다음 번에 카드를 클릭하면 카드가 보이지 않게됩니다 카드를 클릭하면 뒷면으로 향하게됩니다 그들은 얼굴을 마주 보게 될 것이고 일치 할 것입니다, 그래서 그들은 모두 등을 맞댄 성공적으로 매치 할 것이다, 그래서 거기있을 것이다 그들은 명확한 배경과 투명한 배경을 갖게 될 것입니다 우린 그들을 볼 수 없을거야 우린 그들을 다시 보지 않을거야

이제 게임이 완료되었습니다 이제 숙제를하면 이제 게임이 끝납니다 숙제에서, 당신은 원할 것입니다 새 게임 버튼을 추가하십시오이 버튼을 누르면 언론에 새로운 게임을 시작하는 버튼을 추가하십시오

포인트, 나는 다른 게임을하지 않을 것이다 마지막으로 나는 다른 게임을하지 않을 것이다 마지막 물건 행운을 빌어 카드를 더 추가하는 것입니다 운 좋게도 카드를 더 추가 할 시간이 있습니다 네 장의 카드는 지루한 게임이기 때문에 네 장의 게임은 조금 지루합니다

여기에 UI로 가보자 UI가있다 UI로 가자 UI가 있습니다 여기에있는 버튼은 80 포인트 너비가되어야합니다

나는 80 픽셀 너비의 버튼을 만들 것을 권장합니다 숙제 때문에 80 포인트 너비 때문에 많은 숙제가 있습니다 너비가 80 픽셀이므로 맞아요 정말 멋지 네요 괜찮습니까? 4 장의 카드 배치에 잘 맞 춥니 다

우리를 보자 위로, 이제는 작은 파란색 선을 사용하여 나를 도울거야이 선을 써라, 나는이 파란색 선을 사용할 것이다 파란색 선을 사용하면 그들을 배치하는 데 도움이됩니다 이 파란색 선을 사용하는 경우 그들 중 4 명은 80 점 씩 오른쪽에 맞춰졌고, 4 명은 수평으로 80 픽셀로 배열되었습니다

그럼 내가 더 만들거야 나는 그들을 선택할거야 그리고 나는 더해야 해 나는 그들을 선택하고 싶다 붙여 넣기 복사 : 블라인드를 사용하고, 파란색 선을 붙여넣고 복사하여 붙여 넣습니다

이 루버 같은 것들을 사용하십시오,이 파란 선들 더 많이, 여기에 12 개를 가져 가자 더 복사해라 이제 12 장의 카드가있다 모든 것이 연결되어 있는지 확인해야 모든 것이 연결되어 있는지 확인할 필요가 있습니다 터치 카드를 보자

이봐, 모두 터치 야 터치 카드 좀 보자 둘 다 터치 카드 메시지를 보냅니다 카드, 카드 버튼은 어때요? 우리가 복사하면 좋아 cardButtons에 관해서? 복사하여 붙여 넣을 때 붙여 넣기로 카드 단추 콘센트에 넣지 않고 카드 배열 종료 배열에 넣지 않습니다

버튼의 배열, 그래서 우리가 할 필요가있다 그래서 우리는 이것을 할 필요가있다 Ctrl 키를 누른 상태에서 드래그하면됩니다 이제 실제로 12 장의 카드 또는 12 장 이상의 카드를 가지고 있다면 실제로 12 장 이상의 카드를 실제로 가지고 있다면 실제로 평생 동안 아울렛 컬렉션을 사용하지 않을 것입니다 출구 컬렉션을 사용할 수 없습니다 코드에 들어가서이 모든 것을 찾으십시오

코드로 이동하여 모든 것을 찾을 수 있습니다 모든 것을 하나 또는 실제로 할 수 있습니다 한두 줄의 코드를 사용할 수 있습니다 실제로 두 줄의 코드가 있습니다 그러나 실제로 배웠던 것은 아닙니다

모든 것을 얻으십시오 하지만 당신은 여전히 해외에서 뷰 계층 구조가 작동하는 방식 및 뷰 중첩이 작동하는 방식에 대해 나에게서 배웠다 너의 숙제 때문에 너의 숙제 때문에 당신은 단지 드래그 컨트롤을해야 할거야, 내가했던 것처럼 드래그 컨트롤을 할거야

나는 그들 모두를 구부리 듯이 모두 엮여있어 그들을 연관시킨다 그들은 모두 연결되어있다 그들은 모두 연결되어 있습니다 플립 카운트 라벨이 꽂혀 있습니다 우리의 flipCount 태그가 이미 연결되었습니다

우리의 UI가 모두 설정되어 있습니다 아무 것도 변경하지 않았지만 UI가 설정되어있는 것 같습니다 나는 그 것을 제외하고는 아무것도 바꾸지 않았다 어디에서나 코드를 변경하지 않았습니다 코드를 변경하지 않았습니다

좋아, 나는 단지 내 UI에 버튼을 더 넣으십시오이 기능을 구현했기 때문에 UI에 더 많은 버튼을 넣었습니다 그리고 내가이 좋은 것을 만들었 기 때문에 실제로 모든 카드 수를 처리 할 수있는 유연한 UI, 유연한 인터페이스로 어떤 수의 카드라도 실제로 처리 할 수 ​​있습니다 이 작업은 효과가 있습니다 이제 시작하겠습니다

시작하자 시도 해보자 우리는 사탕, 사과, 시험해보기, 사탕, 사과 일치하지 않습니다 전 박쥐가 있습니다, 일치하지 않습니다 일치하지 않습니다

나는 박쥐가있어 호박은 어때? 호박 나는 사탕을 기억해 호박은 어때? 이봐 요! 캔디, 사탕의 위치를 ​​기억하는 것 같아 아마 여기 있었을까요? 예, 여기 있습니까? 예 우리가 그 사탕을 바로 옆에 놓은 것을 발견했습니다 와우, 우리는 사탕을 발견했습니다, 그들은 서로 옆에 있습니다

다른 것을 시도해 봅시다이게 어때요, 사과, 다른 것을 시도해 봅시다 어때, 애플? 아니, 일치 하지마 오, 사과 오, 이거 꽤 쉬운 게임이야 이봐 요, 사과, 이건 아주 간단한 게임입니다 왜 모두가 집중력을 생각하는지 모르겠다

그래서 모든 사람들이 플립이 매우 훌륭하다고 생각하는 이유를 모르겠다 하드, 저것 좀 봐 알았어, 어려워, 저거 봐 확인 모든 작업이 완료되었습니다 그렇다면 왜이 게임이 그렇게 쉬운가? 그렇다면이 게임은 왜 그렇게 단순합니까? 숙제를 아직 끝내지 않았기 때문에 너희들이 아직 숙제를하지 않았기 때문에

만약 당신이 여기서 다시 기억한다면 우리가 가진 농도 당신이 농도 파일에서 기억한다면, 우리는 여전히 이 작은 일은 특별한 논평입니다 그런데 ToDo는 특별한 메모입니다 여기에있는 Xcode의 최상위 줄을 보면, 바로 위쪽의 줄을 보면, 어떤 파일을 선택했는지 표시하고, 어떤 파일을 선택했는지 보여줍니다 그것은 또한 당신에게 보여줍니다 이 파일에 모든 메서드와 속성 및이 파일의 모든 메서드와 속성이 있습니다

//하면 카드가 섞여 보이고, ToDo 주석을 쓰면 그 카드가 나타납니다 카드 섞기를보세요 월요일에 보자 >> 좋아, 월요일에 보자 더 자세한 정보는 Stanford

edu를 방문하십시오 >> 더 많은 강좌는 stanfordedu에서 가능합니다

PHP Convertidor de moneda

안녕하세요 제 이름은 알렉스와 오늘 우리는 PHP에서 통화 변환기를 만들 것입니다 우리는 우리 폴더에 갈거야 PHP 운동 그녀의 내부 우리는 새로운 폴더를 만들 것입니다

우리는 변환기라고 부를 것이다 이제 우리는 숭고한 본문으로갑니다 새 파일 우리는 그것을 우리는 우리의 폴더를 찾습니다 xampp htdocs PHP 연습 변환기 우리는 변환기라고 부를 것입니다 – 통화

PHP 우리는 그것을 지킨다 이제 우리는 우리 폴더로 간다 그리고 당신이 볼 수 있듯이 우리는 통화 변환기라는 새로운 PHP 파일을 가지고 있습니다 이제 우리는 html의 구조를 만들 것입니다 html 구조체의 내부에서 폼을 생성합니다

우리는 post 메소드를 통해 그것을 보낼 것입니다 양식 안에 입력을 만들 것입니다 텍스트 유형 이름 양 크기 우리는 10을 넣을 것이다 이제 다른 입력을 만듭니다 유형 제출하다 가치로서 우리는 그것을 돌릴 것이다

우리는 당신에게 제목을 줄 것이다 들어가다 수량 우리는 br를 만든다 우리는 다른 제목을 짓는다 유형 선택 전환 전환 우리는 또 다른 br을 만든다 이제 다른 입력을 만든다

유형 라디오 이름 전환 가치 1 우리의 의견에 확인한 이 동일한 입력을 복사합니다 우리는 그것을 붙인다 우리의 첫 번째 입력에 달러 두 번째는 내가 넣을 것이다 레미 라 내 나라 온두라스의 국가 통화 이제 우리는 새로운 파일을 생성 할 것입니다 우리는 그것을 개종시키다

PHP 우리의 파일 내에서 우리는 PHP 태그를 생성 할 것입니다 이제 변수를 만듭니다 우리는 그것을 conv라고 부를 것이다 같은 우리는 POST 메소드를 호출하기 위해 보낸다 우리는 전환 전환 라디오 입력의 이름입니다

두번째 입력에 우리는 2 번을 넣을 것입니다 가치 있음 이제 우리는 조건을 만들 것입니다 입력 금액이 입력되었는지 평가하는 것 텍스트 유형 소위 금액 이제 우리는 조건을 만든다 우리가 isset 함수를 호출하기 위해 보낸 괄호 안쪽 var 안에있는 괄호 안쪽 우리는 전화를 보내 우리에게 금액이라는 텍스트 입력 우리는 POST 메소드로 호출하기 위해 그것을 보낸다 소위 금액 우리가 정의 함수를 호출한다면 우리 안에서 우리가 넣을 괄호 안쪽에 이름이 뭐니? 우리는 양을 놓을 것이다

가치가있는 곳 우리는 양 무슨 냄비에 온다 POST 이제 우리는 이제 우리가 방금 만든이 조건으로 isset은 변수가 POST를 통해 오는 금액은 null입니다 데이터가 입력 된 경우 null이 아닌 경우 입력 세트를 평가 한 다음 POST에서 오는 변수 null이 아닌 경우 if 내부에있는 것을 실행합니다 함수를 정의하면 수량이 정의됩니다 POST 금액에 따라 달라지는 변수가 있습니다 그 밖에 우리는 메시지를 만들 것입니다

우리가 어디에 넣을까요? 이제 우리는 다른 조건을 만들 것입니다 어디에서 우리의 변수 전환 그것을 괄호 안에 넣는다 똑같아 1 내부에있는 것을 실행하는 경우 우리는 또 다른 메시지를 전한다 우리는 우리 함수의 양 지금 나는 19로 그것을 곱할 것이다

우리가 처음부터 입력하는 것 텍스트 유형 입력 달러로 할거야 그리고 나는 이것을 렘 피라로 바꿀 것입니다 온두라스의 국가 통화 달러가 19 개의 lempiras에 해당한다고 다른 메시지를 만듭니다 그리고 그를 데려 간다 레미 라 지금 지금 나는 else를 만든다

지금은 잘 우리의 conv POST에서 오는 변수입니다 conv라는 우리 입력 라디오의 우리가 값 1과 2를 넣었습니다 conv가 1인지 여부를 묻는 조건 첫 번째 클릭하면 우리가 가치 1을 두는 라디오 if 내부에있는 것을 실행합니다 그렇지 않다면, 우리는 2 번을 클릭하고 else 안에있는 것을 실행할 것입니다 지금 이 두 메시지를 복사합니다 우리는 그것을 다른 사람 안에 찔러 넣는다

지금 양이 발생합니다 나누다 왜냐하면 우리가 lempira에 들어가면 두 번째로 lempiras에서 끝날 것이기 때문입니다 그것을 나눌 것이다 19 달러 사이 두 번째 메시지에서 우리는 달러 우리는 이미 우리의 파일 변환 기능을 만들었습니다 우리의 형식에서 어디서 행동하니? 우리는 개 심자 이제 변환기를 테스트하기 위해 브라우저에 간다

우리는 localhost 운동 PHP거야 그리고 우리 폴더는 어디 있습니까? 우리가 클릭하는 변환기 우리는 환율 계산기를 선택합니다 보시다시피 양식이 나타납니다 텍스트 입력 버튼 우리의 buttom 라디오 우리가 선택할 수있는 달러 레핀을 말하는 1 / 2 이제 우리는 변환기를 승인 할 것입니다 colocare $ 50 나는 lempira로 이사 할거야 내 버튼을 실행합니다

보시다시피 메시지가 나타납니다 950 종려 나무 이 $ 50는에 간다 950 개의 뱀파리와 온두라스의 50 달러에 해당하는 금액은 950 개의 렘 피라 지금은 950 달러로 그들을 전달합니다 나는 950을 쓴다 내가 선택한 lempira lempira 때문에 나는 그들을 달러로 보낼 것이다 내 버튼을 실행합니다 보시다시피, 그들은 나타납니다

$ 50 그건 950 개의 lempiras가 $ 5000 좋은 친구 우리는 이미 통화 변환기를 만들었습니다 달러에서 레미 라까지 그리고 lempiras에서 달러까지 그러나 당신은 그것을 두면서 그것을 수정할 수있다 당신의 나라의 통화 오늘 모든 좋은 친구 그래서 우리는 다음 때까지 서로를 보게 될 것입니다

MVC

DOUG LLOYD : 때때로 우리가 프로그래밍 할 때, 우리는 일을 그렇게 자주, 너무 자주, 그리고 너무 많은 사람들이 똑같은 아이디어를하거나 똑같은 일을해라 MVC는 정확히 그런 것 중 하나입니다

이를 프로그래밍 패러다임이라고합니다 그것은 일종의 베스트 프랙티스와 같은 것입니다 뭔가를하려고하는 사람들이이 경우 페이지 시스템을 구현합니다 사용자가 더 복잡한 웹 사이트와 상호 작용하는 매우 일반적으로 완료되어 표준으로 권장됩니다 다른 사람들이 따르기를 좋아할 수도 있습니다

그리고이 패러다임을 따라갈 수있는 매우 구체적인 방법이 있습니다 그래서 MVC는 패러다임입니다 그리고 우리가 사용하는 이유는 사용자로부터 세부 사항을 멀리하는 것입니다 사용자가 실제로 볼 필요가없는 것들 그들은 단지 좋은 사용자 경험을 원합니다

그리고 우리는 그 (것)들을 각 단일 파일에 액세스 할 필요가 없습니다 아마도 웹 서버에 존재합니다 사용자 경험을 향상시키는 데 사용되는 파일이있을 수 있습니다 그래서 우리는 그 사람들을 추상화 할 수 있습니다 우리는 그들을 숨길 수 있습니다, 사용자가 그들과 함께 일할 수 없다고 말하지만, 우리 페이지 – 우리의 페이지는 – 어떻게 그들을 다루고 그들에게 전화할지, 또는 아마도 그 (것)들을 또는 그 같이 원하는가 MVC의 주요 동기는 데이터 보안입니다

왜냐하면 MVC는 대개 데이터베이스 작업의 맥락에서 나온다 특히 사용자를 차단하고자합니다 데이터베이스에 직접적으로 영향을 미치지 않습니다 우리는 여과의 종류를 통해서만 간접적으로하고 싶습니다 또는 우리가 모든 것이 OK인지 확인하십시오

약간의 오류 검사 또는 안전 조치 수행 우리가 데이터베이스에 보내기 전에 교정을해라 물건이 잘못 될 수있다 우리가 조심하지 않으면 아마도 정말로 틀린 것입니다 그래서 MVC는 Model View Controller를 의미합니다 각각의 의미는 무엇입니까? 기본적으로 모델은 데이터베이스입니다

사이트의 모든 중요한 데이터가있는 곳입니다 로그인 – 사용자 이름, 로그인, 비밀번호 그리고 당신은 그것을 업데이트 할 수 있고, 그것을 참조 할 수 있습니다 데이터베이스를 쿼리합니다 당신은 데이터베이스로부터 정보를 요청할 것입니다 그 모델, 귀하의 사이트가 살고있는 모든 데이터입니다

보기는 사용자 경험과 비슷합니다 그들이 정보를 요구 한 후에 보는 페이지입니다 아마 로그인 정보를 제출할 수도 있습니다 그들은 컨트롤러에서 할 것이고, 우리는 잠깐 후에 이야기 할 것입니다 그들은 아마도 로그인 정보를 제출할 것입니다

그리고 데이터베이스가 쿼리됩니다 정보가 요청되어 데이터베이스에서 가져옵니다 그런 다음 사용자가 로그인하면 홈 페이지가 표시됩니다 그것이보기입니다 그런 다음 컨트롤러는 사이트의 비즈니스 로직이라고 불리는 것입니다

비즈니스 로직은 일종의 우스꽝스러운 용어입니다 비즈니스 로직은 무엇을 의미합니까? 기본적으로 비즈니스 로직은 PHP입니다 사용자는 PHP를 직접 볼 필요가 없습니다 하지만 PHP가 아마 데이터베이스에 요청을 보낼 것입니다 따라서 사용자는 뷰에서 정보를 입력하게됩니다

컨트롤러를 통합 할 것입니다 마찬가지로, 그들은 양식에 입력합니다 그 양식이 정보를 처리하는 방법이 컨트롤러입니다 이것이 실제로 모델에 요청하는 PHP입니다 그리고 나서 모델은 정보를 뷰에 제공하고, 이것은 사용자에게 제공되며 아마도 다음과 같이 가장 잘 시각화 될 수 있습니다

여기에 우리가 왔습니다 왼쪽에는 모델이 있고 Model View Controller가 있습니다 일종의 패러다임 배열 어떻게 작동합니까? 사용자 (us)는 컨트롤러에 요청합니다 우리는 HTTP 양식과 같은 정보를 제출합니다

이를 바탕으로 컨트롤러의 임무는 사용자가 제공 한 것은 모델을 손상시킬 수있는 것이 아닙니다 그래서 컨트롤러가 모든 것이 정상인지 확인합니다 아주 조심스럽게 보일거야 오류가 있으면 사용자가 모델에 도달 할 수 없도록 작업이 중지됩니다 그러나 모든 것이 OK이고 유효한 쿼리라고 가정하면, 컨트롤러는 모델을 쿼리합니다

정보 제공을 요청할 것입니다 모델은 해당 정보를보기 페이지에 제공합니다 그렇게 전송할 것입니다 그런 다음보기에서 정보를 채 웁니다 모델에서 요청했습니다

예를 들어 Facebook 페이지에 로그인하는 경우, 예를 들어보기는 친구와 뉴스 피드 또는 물건을 나타내는 모델에서 나왔습니다 그렇게 하지만 다른 사람은 보지 못할거야 자네가 질의를 제출할거야 페이지에 로그인합니다

컨트롤러가 로그인 정보를 사용합니다 모델에 요청하여 당신이 당신이 말하는 사람인지 확인하십시오 모델은 좋아, 좋아 당신은 당신이 말하는 사람입니다 그럼 내가 너에게 뉴스 피드를 줄께

보기에 뉴스 피드의 원시 데이터를 제공하고, 그런 다음 뷰는 그것을 일종의 예쁜 방식으로 처리합니다 우리가 익숙한 정보를 사용자에게 표시합니다 이 다이어그램에없는 연결을 확인하십시오 거기에 당신과 모델 사이에 직접적인 연결이 없습니다 항상 컨트롤러의 버퍼는 입력면에 있습니다

그리고 출력면에는 뷰의 버퍼가 있습니다 어쩌면 너는 좋은 사람이 될지도 모른다 모델을 손상시키지 않습니다 하지만 어쩌면 당신이 아니거나 누군가가있을 수도 있습니다 누가 데이터베이스를 손상시키고 자하는 악의적 인 사용자인가, 데이터베이스에서 모든 것을 삭제할 수 있습니다

매우 비쌀 수 있습니다 분명히 사용자 데이터가 있으면 사용자 데이터를 가질 가치가 있습니다 그래서 우리가이 버퍼 영역을 사용자 사이에 두지 않으면 그리고 데이터베이스, 사용자 및 모델, 우리에게 일이 그렇게 잘되지 않을 수도 있습니다 따라서 사용자가 할 수있는이 패러다임을 갖는 것이 중요합니다 데이터베이스와 상호 작용합니다

그러나 그들은 그것을하기 위해 우리를 거쳐야 만합니다 기본적으로 MVC의 아이디어입니다 데이터 보안을 구현하려고합니다 실수로 또는 의도적으로 모델을 보호하려고합니다 악의적 인 사용자

이 패러다임을 적용하면 어떻게됩니까? 글쎄, 우리는 우리의 웹 사이트, 모델, 우리의 웹 사이트를 구현하는 논리에서 기능, 컨트롤러 및 단순한 미학과 페이지 사용자 경험을 구성하는 템플릿,보기 이것은 무엇을 의미 하는가? 음, 사용자가보기를 볼 수있게 만들 수 있음을 의미합니다 모델을 숨길 수 있습니다 그리고 사용자가 직접 조작 할 수없는 컨트롤러 PHP 코드에 액세스 할 필요가 없습니다 그들은 물건을 입력 할 수있는 양식을보아야합니다

그러면 폼이보기 일 것입니다 컨트롤러는 양식을 제출하는 PHP입니다 컨트롤러가 모델에 쿼리를 작성합니다 모델은 다른보기에 더 많은 정보를 제공합니다 정보를 표시합니다

귀하의 프로그램은 모든 비즈니스 로직에 액세스 할 수 있습니다 그러나 사용자는 비즈니스 논리에 직접 액세스 할 수 없습니다 그리고 특히, 아마도 이것에 대한 가시적 인 그림 403 금지 된 오류가 발생했는지 여부입니다 웹 페이지에 가서 "403 Forbidden"을 본 적이 있습니까? 그것은 일종의 404 Not Found와 같습니다 403 금지됨은 액세스 할 수없는 페이지에 액세스하려고했음을 의미합니다

아마도 해당 사이트에서 MVC 분리를 사용하고있을 것입니다 서버에 순서대로 존재해야하는 비즈니스 로직을 숨기려면 페이지가 작동하기는하지만 사용자가 직접 페이지에 액세스하는 것을 원하지는 않습니다 따라서 403 Forbidden 오류가 발생할 수 있습니다 그리고 만약 당신이 로그인했다해도 상관 없습니다 사용자는이

php 파일을 만질 수 없습니다 그들은 이걸 만질 수 있습니다 그리고이 하나, 그들이 만질 수있는 하나, 아마도 잠긴 파일과 상호 작용할 수 있습니다 사용자보다 간접적으로 그래서 우리는이 403 금지 된 권한 오류를 때때로 봅니다 사물을 볼 수 있도록 권한을 어떻게 변경합니까? 우리가 일반적으로하는 방법은 chmod라는 CH-mod라는 리눅스 명령을 사용하는 것입니다

이렇게하려면 형식이 매우 간단합니다 chmod permissions 변경 사항을 적용 할 파일을 선택하십시오 아마 이런 식으로 보일 겁니다 chmod 600 helpersphp

아니면 chmod a + x includes 디렉토리를 볼 수 있습니다 그래도이게 무슨 뜻이야? 따라서 권한이 일반적으로 두 가지 다른 방법이 있습니다 chmod를 사용하여 적용됩니다 첫 번째는 8 진수 숫자 메소드라고합니다 일반적으로 세 가지 카테고리에 권한을 적용합니다

동시에 사용자 수를 늘릴 수 있습니다 그래서 chmod 711 파일은 당신에게 읽기, 쓰기, 실행 권한을 부여합니다 당신의 파일은 다른 사람들을 허용 할 것입니다 구체적으로 말하자면, 당신의 그룹과 세계는 오직 파일을 실행하기 위해서입니다 그것이 바로 다음과 같은 의미입니다

첫 번째 숫자는 할 수있는 일입니다 두 번째 숫자는 그룹이 할 수있는 숫자입니다 그리고 세 번째는 세상이 할 수있는 것, 당신의 페이지를 방문하는 사람입니다 그것은 세상입니다 그렇다고이 숫자가 실제로 번역되는 것은 무엇입니까? 그래서 그들은 기본적으로 이것을 번역합니다

권한이 0이면 아무 일도 일어나지 않습니다 1 인 경우 사용자의 허가가 있으면 파일을 실행할 수 있습니다 2 인 경우 파일을 쓸 수 있지만 다른 작업은 할 수 없습니다 3이면, 볼 수 있듯이 작성하고 실행할 수 있습니다 7 7은 모든 것을 할 수 있다는 것을 의미합니다

왜 8 진수라고 부르는가? 글쎄, 네가 그것에 대해 생각한다면, 여기에, noes와 yeses가있다 우리가 빨간색과 녹색 상자로 생각하면, 어쩌면 그것으로 인해 조금 더 명확해질 것입니다 그러나 우리가 그 빨간 박스를 0과 녹색 상자로 생각한다면 1의 경우, 이들은 실제로 이진수 집합입니다 맞습니까? 000은 십진수 0으로 변환됩니다 001, 10 진수

010은 십진수 2, 등등입니다 그리고 우리는이 8 진수를 8 개의 다른 가능성이 있습니다 우리가 8 자리수가 있다면 3 비트의 정보를 말하는 것 – 읽기 비트, 쓰기 비트 및 실행 비트 이제는 2 진수, 10 진수, 16 진수 및 8 진수를 말할 수 있습니다 그래서 당신은 4 개의 다른 숫자로 컴퓨터와 통신하는 방법을 안다

시스템 꽤 괜찮은데 따라서 8 진수 허가 제도 외에도 또한 약간 다른 상징적 인 허가 계획 일반적으로 이사회 전반의 허가를 적용하거나 제거하는 데 가장 잘 사용됩니다 따라서 chmod a + x 파일은 세 가지 범주 모두에 실행 권한을 추가 할 수 있습니다 사용자 중 – 너 자신, 너의 그룹 및 세계

플러스가 추가 부분입니다 실행 권한은 x입니다 그리고 이것이 세 그룹의 모든 사용자에게 적용된다는 사실은 따라서이 + x는 아마도 chmod 711 파일과 정확히 같을 것입니다 왜냐하면 만약 여러분이 돌아가서 8 진수 체계를 보면, 1과 7은 우리에게 파일을 실행할 권한을줍니다 그래서 이것은 아마도 동일합니다

이 참조 가이드는 상징적 chmodding 구조의 다양한 것들이 있습니다 여기서 녹색 항목은 모든 초록색 예제가있는 곳입니다 두 번째 전이었다 파란색은 파란색입니다 오렌지색이 오렌지색입니다

따라서 그룹, 다른 사용자, 사용자에게 적용 할 수 있습니다 또는 모두에게 사용자에게 읽기, 쓰기 및 실행 권한을 부여 할 수 있습니다 그리고 세트를 정확히 추가하거나 제거하거나 할당 할 수 있습니다 이 모델을 사용하는 권한의 파일의 권한 구성표가 무엇인지 확인하려면 어떻게해야합니까? 우리가 그것을 바꾸기 전에 실제로 알고있는 것이 좋습니다

파일 사용 권한은 무엇입니까? 이를 수행하는 한 가지 방법은 ls를 실행하는 것입니다 그러나 조금만 조정하십시오 그래서 내가 ls -l– 그게 소문이야 어쩌면 조금 이상한 표정을 지닌이 같은 것을 보게 될 것입니다 하지만 우리가 정말로 신경을 쓰는 부분은 저기 왼쪽에있는 것들입니다

사실 그것은 파일 권한 구성표를 지정합니다 당신은 아마 r, w, x가 산재 해 있기 때문에 말할 수 있습니다 처음 세 개는 무시하고 잠시 동안 우리는 두 배로 돌아갑니다 첫 번째 이후 처음 3 ~ 2 번째, 3 번째, 그 10 자 문자열의 네 번째 문자 – 보유하고있는 사용 권한입니다 따라서 필자는 PHP를 읽고 쓰고 실행할 수 있습니다

필자는 php-webdev를 읽고 쓰고 실행할 수 있습니다 그리고 testphp를 읽고 쓸 수 있습니다 우리 그룹이 그렇게 할 수 있습니다 그래서 분명히 php와 php-webdev 디렉토리를 가지고, 내 그룹은 그들에게 글을 쓸 수 있지만 그 외에는 쓸 수 없다

그리고 세상은 아무것도 할 수 없습니다 따라서이 파일은 공개적으로 액세스 할 수 없습니다 그리고 내가 그들에게 접근하려고 시도했을 때 나는 그렇지 않았다 아파치를 실행하여 액세스 가능하게 만들면 403 오류가 발생합니다 실패입니다

파일에 액세스하려고했지만 권한이 없습니다 그 첫 번째 캐릭터는 무엇입니까? 음, 아마 여기서 외삽 할 수있을거야 디렉토리는 디렉토리를 가리키며 대시는 참조를 의미합니다 이른바 정규 파일들 그리고 아마도 여러분이 우리의 파일 시스템을 사용하여 파일을 제거하려 할 때 이것을 보았을 것입니다

당신은 일종의 비밀스러운 메시지 "일반 파일 제거"를 보았습니다 – 이 경우에는 testphp가됩니다 일반 파일은 디렉토리가 아닌 것입니다 여기에 몇 가지 다른 것이 있지만 일반적으로 디렉토리에 대해서는 d' s를 보게되고 첫 번째 요소에 대해서는 아무것도 보이지 않을 것이다 하지만 그게 전부입니다

ls -l을 사용하여 파일 사용 권한을 확인할 수 있습니다 chmod를 사용하여 변경할 수 있습니다 물론, 이러한 권한을 변경하는 데 사용하십시오 이 MVC 패러다임을 적용하여 웹 사이트의 데이터 보호 사용자가 모든 것을 액세스하는 것을 허용하지 않으며, 하지만 귀하의 페이지에 순서대로 액세스해야하는 항목 만 네가 원하는대로 일하게 나는 더그 로이드입니다 이것은 CS50입니다

V03 – Simple MVC with Laravel 5.1

데이터베이스 만들기 MySQL Workbench 제품 테이블 생성 샘플 데이터 삽입 "자동차"모델 클래스는 "자동차"테이블에 매핑되므로 테이블을 "제품"으로 변경할 수 있습니다 제품 모델 생성 ProductController 만들기 ProductController의 경로 만들기 ProductController의 액션 쇼 코드를 작성하십시오

productsshow보기 만들기 구성 DB 연결 URL 오류 수정 모델 값을 전달하여보기 이미지 src를 DB image_url로 바꿉니다 모든 제품을 나열하는 ProductController 색인 작업 만들기 제품보기 색인보기 만들기 사용자 @foreach는 각 제품 항목을 렌더링합니다 제품 링크 수정 컨트롤러 도움말에 대한 URL을 생성하는 사용자 도우미

046b — Model View Controller MVC

안녕하세요 이 세션에서는 MVC를 살펴볼 것입니다

Model View Controller 용 MVC입니다 MVC 우리가 디자인 패턴이라고 부르는 것입니다 또는 불어로 gabarit de 개념 작용 사실로 디자인 패턴이 등장한 것입니다 특히 책이있는 90 년대 그 이후로 여러 번 복각되었지만 4의 띠로 95 세에 나타났다

네 명의 작가는 누구인가? 감마, 조타 장치, 존슨, Vlissides 사실 건축가의 훨씬 초기 작업에서 영감을 얻었습니다 진정한 건축가 이 작품은 "패턴 언어"를 가진 책 형태로 나왔다 그리고 그것은 매우 밀접하게 연결된 건축에서 용어의 고전적 의미에서 건물의 기능과 관련하여 실제로이 아이디어는 특정 수의 모델 디자인 패턴의 형태로 좋은 프로그래밍 규칙 하지만 조금 지나면 무의미한 운동 그러나 우리는 이러한 디자인 패턴의 특정 숫자가 매우 흥미있는 당신은 몇 가지 윤곽선을 가지고 있기 때문에 흥미로운 점은 방법의 배려 가능한 가장 휴대 가능하고 표준화 된 방식으로 이러한 개요를 정의하십시오

그래서 우리는이 스키마에 참여하는 엔티티 간의 관계를 명확히하려고합니다 관계가 명확하고 특히 유지 보수가 용이하기 때문에 유지 보수가 수월합니다 이러한 것들은 시간이 지남에 따라 점진적으로 완성되었습니다 엄청난 수의 패턴이있다 위임, 클라이언트 서버 등

모델 뷰 컨트롤러이므로 컴퓨터 과학자로서 중요합니다 이 책 (RTFM)을 살펴보기 모든 선에서 사용할 수 있어야한다 도서관 특히 대학

이제는 MVC에 대해 항상 알고 싶었지만 감히 결코 묻지 않은 모든 것에 대해 참여와 함께 우디 알렌 MVC에서, 놀랍게도, 한 부분은 불렀습니다 모델 이 모델 (sic) 부분은 실제로 시스템 내에서 처리되고이 데이터는 우리로 하여금 국가 사실 모델 부분은 독점적으로 그것에 전념하고 있습니다 이 부분은 두 번째 부분과 연결됩니다 제어기 그것을 위해 전체 시스템을 제어 할 것입니다

모든 행동이 그것을 통해 진행될 것이며,이 행동을 처리 할 부분입니다 물론 정의 된 컨텍스트 데이터로 세 번째 클래스에 의해 정의 된 시각화를 기반으로합니다 그것은보기입니다 뷰 자체는 주로 외부와의 인터페이스를 처리합니다 우리가 센서라고 부르는 것을 공급합니다

즉 실제로 메커니즘 상호 작용을 가능하게하는 주로 컨트롤러를 자극합니다 일반적으로이 세 엔티티 사이에는 다음과 같이 정의되는 관계가 있습니다 말하자면 기본적으로 뷰는 모델과 통신하지 않습니다 주로 컨트롤러를 통과합니다 뷰와 컨트롤러 사이에 상호 작용이 있으며 컨트롤러가 작동합니다

데이터에 따르면 솔직히 조금 더 유연해질 수 있습니다 보기가 읽기 액세스 권한을 갖는 것이 흥미로울 수 있습니다 및 읽기 전용 액세스를 모델에 적용하면, 예를 들어, 도네네이션을 한 요소에 표시하고 싶다면, 그것은 약간 어리 석다 컨트롤러를 통과하고 간접비를 검색하기위한 간접 검색을 생성해야한다 이렇게하면 컨트롤러 수준에 코드가 추가되어 작업이 무거워집니다

반면에, 우리는 참으로 내가 읽을 수있는 방법이 있다고 상상해 보라 엘리먼트를 컨트롤러를 거치지 않고 직접 가져온다 반면에 데이터의 모든 업데이트를 포함하여 중요한 일부 그 아이디어는 반드시 컨트롤러를 통과하지 않아야한다는 것입니다 따라서 모델은 일반적으로 전용 클래스입니다 컨트롤러는 UIViewController 클래스에서 상속받은 클래스가됩니다

어느면에서 프로토콜 – 나중에 살펴 보겠습니다 그리고 수업 이 모델의 뷰를 나타내는 UIView에서 상속받은 클래스가됩니다 기본적으로이 단계에서는 모노 뷰 응용 프로그램을 개발할 때 보았습니다 AppDelegate라는 파일이 있다는 것을 보았습니다 당신이 속해 있는지 여부에 따라 1 또는 2 개의 파일이있는 수업 Swift 또는 Objective-C eand를 사용하면 다음과 같은 결과를 얻을 수 있습니다 ViewController 이 ViewController는 하나의 뷰의 컨트롤러이며 실제로 우리가 가지고있는 순간입니다 우리 예제에서 모든 것을 조금 넣어주세요 우리는 이론적으로 그것을 볼 것입니다

정확히 그런 것은 아닙니다 사실 우리가해야 할 일은 이것입니다 :이 ViewController 디스플레이를 다루는 뷰를 개발할 것이다 뒤 파일럿과 그것이 xx를 다루기로되어있다 솔직히 말해서, 당신이 보았던 몇 가지 예와 당신이 보게 될 사람들 나는 항상이 스키마를 stricto sensu 존경하지 않는다 특히 극히 간단한 예제들에 대해서

때로는 모든 것을 컨트롤러에 넣는 경향이 있습니다 그러나 다시 한 번 나는 나의 예제가 너무 단순하기 때문에 실제로 더 실용적이지만 신청서에 더 심각한 단계가 발생하면 즉시 뷰에 관한 모든 것을 뷰에 담고, 모델의 데이터에 관한 것들을 넣고, 나머지는 컨트롤러로 우리는 이미 해본 운동의 몇 가지 예를 들려 올 것입니다 특히 Nuancier RVB (컬러 차트)에서 그래서 Nuancier RVB에서 우리는 이와 같은 것을 갖게 될 것입니다

우리는 예제가 없기 때문에 실제로 모델을 가지고 있지 않습니다 기본적으로 하나의 변수가 있습니다 또는 3 개의 정수가있는 테이블 우리는 마침내 저장해야하기 때문에 R, V, B 그리고 나서 3 번 우리는 모델을위한 클래스를 가질 수 있지만 그것은 약간 무겁습니다 9 개의 정수를 저장한다 우리는 반면에 ViewController를 가지고있다 잡을 수있는 그것을위한 사건들

그리고 여기에 우리는 견해를 가지고 있습니다 이것은 기본적으로 실제로 예를 들어 표시 될보기입니다 해당하는 슬라이더 녹색, 빨강, 파랑 다시 돌아가려면 버튼을 누르십시오 0으로 설정하고 저장 버튼과 기억 버튼 그러나 사실 무슨 일이 일어날 지 마침내 그려져서 StoryBoard로 해냈습니다 이전 연습에서 그러나 프로그래밍 방식으로 개발한다면 여기 실제로 UIView에서 상속되는 별도의 클래스를 그립니다

모든 슬라이더가 있지만 다른 한편으로는 당신은 컨트롤러에있을 메소드 이것은 완벽하게 가능합니다 말하자면, 당신은 그 사건을 검색 할 사람이 아니라고 말할 것입니다 당신은 그에게 그것을 보냅니다 그리고 물건 방법을 위해 그것만큼 간단합니다 그리고 물론, 당신은 정말로 필요하지 않습니다

부름 변수를 모델에 저장하기로 결정한 경우는 예외입니다 좀 더 복잡한 연습이었던 것을 봅시다 그것은 퀴즈입니다 퀴즈에서 나는 분명하게 너에게 물었다 질문을 별도의 수업으로 처리하기 질문과 답변을 모두 구현하고있었습니다

사실, 유명한 모델을 선보이는 것 그 다음 ViewController를 통해 우리는 여전히보기가 없었기 때문에 StoryBoard로 개발 된 그러나 ViewController 자체 ~과 연주하다 모델, 특히 그것은 다음 질문을 알기 위해 모델을 심문했다 난이도 등 그리고 여기서 우리가 명시 적으로 뷰를 개발한다면 수요에 따라 디스플레이가 구현된다

보기를 통해 컨트롤러의 우리는 완벽하게 잘 상상할 수 있습니다 예를 들어 질문의 표시, 그런 것들 할 수있다 직접 액세스하는 것으로 예를 들어 콘텐츠 검색 질문들 모델에 직접 액세스하거나 또는 리디렉션을 사용하여 버튼을 사용하여 그러나 당신은 우리가이 MVC 모델을 두 가지 연습으로 instanciate 할 수 있음을 봅니다 너는 이미 일했다 그리고 이것은 흥미 롭습니다 결론적으로 지금은 더 이상 당신이 모른다고 말할 수 없습니다 변명의 오래된 목록을 가져올 필요가 없습니다

"오 잘 나는 음을 몰랐다" MVC를 보았습니다 가능한 한 많이 적용하는 것이 좋습니다 특히 좀 재미 있고 약간 더 복잡한 연습 문제가있을 때 그렇습니다 적용하기 쉽고 훌륭한 고전입니다

인터페이스가 iOS, Android 그리고 X에서도 그렇지만 X로는 좀 더 복잡합니다 X가 상대적으로 오래 되었기 때문에 이것은 무엇보다 중요합니다 그러나 실제로 지금 당신은 정말로 그것을 프로그램해야합니다 아주 쉽다 모든 것이 완료되었습니다

또한 디스플레이 용 하나의 창은 일반적으로 프로세스 전용입니다 특히 여러 스레드를 가질 수있는 여러 객체 어느 것이 처리 할 것인가? MVC 모델의 각기 다른 측면이 있으므로 완전히 고전적이며 잘 알려져 있습니다 정말로 부탁해 어쨌든, 나는 사물을 볼 것입니다 이 모델에 따르면

관심을 가져 주셔서 감사합니다 곧 뵙겠습니다

Php MVC | CRUD with CodeIgniter Framework | Php Course | Learn PHP

환영 그것은 내가가는 것을 정의 할 것입니다 나는 아마도 더 커야했을 것입니다

MVS DMV를 사용하여 펌프 작동이 작성 읽기 용 스탠드인지 확인하십시오 데이터베이스에서 업데이트 및 시작합니다 클릭 만하면됩니다 만약 내가 원한다면 네 네 나는 어떤 종류의 어려움이나 PHP 코스에 대한 도움이 필요하시면 999에서 구입할 수있는 전체 과정들

Php MVC | CRUD with CodeIgniter Framework | Php Course | Learn Php [2019]

이 과정에서 PHP MVC를 통해 환영합니다 조잡한 운영 원유 스탠드는 읽기 업데이트 생성 및 삭제를 위해 CodeIgniter 프레임 워크에서는 새로운 코드를 추가하는 코드를 배우게됩니다

데이터베이스에 기록하고 그것을 삭제하고 기록을 편집하거나 업데이트하는 방법 내가 새 레코드를 추가하기 만하면 그것을 클릭하고 이름을 입력한다고 가정합니다 여기 데이빗 존처럼 암호도 데이빗 이름은 존이고 저장 버튼은 8 번 ID 번호에서 볼 수 있습니다 David John David and John 레코드를 편집하거나 업데이트하려고하면 레코드가 성공적으로 삽입되었습니다 레코드 줄 앞의 수정 버튼을 클릭하면 여기에서 사용자를 변경할 수 있습니다 David Joan 2019 암호는 19 David John 19이며 업데이트 버튼을 누르십시오

이걸 삭제하기로 결정했다면 여기에서 레코드가 성공적으로 업데이트되었음을 ​​알 수 있습니다 데이터베이스에서 레코드 삭제 버튼을 클릭하십시오 레코드가 삭제되었습니다 성공적으로 PHP로만 Dee의 작업을 수행 할 수 있습니다 우리는 PHP MVC Model View 컨트롤러로 이러한 것들을 다뤘습니다 전문가와 전문가에게 PHP로 코딩하고 싶다면 수준의 PHP MPC를 사용해야합니다 당신이 가격 9

99에 완전한 과정을 다만 구매하고 싶은 경우에 조잡한 가동 이 코스에 대한 더 자세한 정보를 원하시면 여기를 클릭하십시오 또한 whatsapp에 문자 메시지를 보내거나에서 전화를 걸 수 있습니다 오전 9 시부 터 오후 5 시까 지,하지만 어려움이 있으시면 이 코스를 구입하면 나와 함께 whatsapp에 관해 토론 할 수 있습니다 그리고 저는 오입니다 문제가 생기면 연락을 클릭하면됩니다

이름 이메일 주소와 귀하의 휴대 전화 번호를 여기에 내 udemy 코스를 모두 업로드 했으니 여기서 볼 수 있습니다 22 개 코스 내 Google 드라이브에이 모든 과정을 업로드했습니다 단지 9 포인트 90 구에 내 스물 두 개의 코스를 모두 구입하십시오 지금 구입을 클릭하면 내 앞에서 내 페이팔 아이디가 8 점 만 남았습니다 90 달러짜리 이걸 좋아하고 이메일로 다음 로그인 때 맞았 어

주소가이 금액을 내게 보내고이 금액의 스크린 샷을 whatsapp 또는 그 시간에 직접 전화를 걸 수 있습니다 이 과정들 중에서 나는이 모든 과정들을이 밑에 링크했다 비디오 나는 또한 이름과 모든 사람을 공유했습니다 이 비디오의 웹 사이트 링크 당신이 많이 즐기고 많은 것을 배우기를 바랍니다 전문가 수준의 모든 것들이 최선을 다해 기원합니다

YouTube에 더 많은 도움을 주신 의견을 보내 주셔서 감사합니다

פרוייקט ראשון ב-MVC

가장 먼저 살펴볼 것은 MVC에서 간단한 프로젝트를 여는 방법입니다 그것을 보는 것이 왜 중요한가? 처음에는 시스템에 어떤 구성 요소가 있는지 확인하려면 HELLO WORLD 프로젝트와 같은 것이 간단하기 때문에 VISUAL STUDIO를 열어 보겠습니다

우리는 FILE NEW PROJECT로갑니다 여기서 우리는 ASPNET MVC 4 WEB APPLICATION을 선택합니다 우리가 최신 FAMEWORK에 있다는 것을 아는 것이 중요합니다 서버에서이 FRAMEWORK을 사용할 수 없다면 매번해야 할 일입니다

폴더에 저장합시다 C 드라이브로 가자 C 드라이브에서 프로젝트 폴더를 엽니 다 이 동영상 중 솔루션에 제공되었습니다 그리고 그 프로젝트 자체에 주어졌습니다

지금 우리가 보는 것은 MVC 프로젝트가 우리에게주는 첫 번째 형식입니다 여기에 숫자가 있습니다 MVC 내의 프로젝트 그가 가장 단순하기 때문에 우리는 비어있는 것을 열어 그와 함께 시작할 것입니다 여기서 우리는 우리가 VIEW ENGINE VIEW ENGINE은 VIEW 자체가 그것은 우리가 기록한 정보를 그것이 사용하는 엔진으로 변환합니다 HTML 생성 MVC가 ASPX 엔진을 처음 시작했을 때 ASP DotNet 엔진이었습니다 코드가 서버에서 실행되었지만 코드가 동일한보기 HTML 페이지의 페이지에있는 것처럼 작성할 수 있습니다

어떤 시점에서 그들은 밖으로 나갔다 훨씬 간단하고 사용하기 쉬운 RAIZOR라는 언어 그리고 그것으로 우리는이 코스를 사용할 것입니다 테스트를 수행하려면 우리 사이트에서 CREATE UNIT 테스트 프로젝트를 표시하고 UNIT TEST라는 프로젝트로 테스트를 수행합니다 나중에 표시하지 않습니다 물론이 창에 관계없이 추가 할 수 있으므로 확인을 클릭합시다

여기에 MVC 시스템이있어 작업을 시작합니다 이제 우리가 볼 수있는 것은 솔루션 탐색기에 몇 개의 폴더가 있으며 그 중 어떤 폴더가 존재하는지 보도록하겠습니다 APP DATA에는 사이트에서 사용할 정보가 들어 있습니다 일반적으로 XML 파일이됩니다 또는 함께 작업하려는 텍스트 파일 일부 로컬 데이터베이스가있는 경우 APPDATA 내에있을 수도 있습니다 (예 : DATA-BASE 파일이 APP DATA에 있지 않을 때 SQL SERVER와 함께 작업하는 것이 좋습니다)

그러나 서버에있는 SQL 파일의 가설적인 위치에 앉아 있어야합니다 앱 시작은 나중에 사용할 모든 종류의 파일을 보유하고 있습니다 MVC는 모든 종류의 설정을 알 수 있습니다 설정할 수있는 모든 종류의 설정 예를 들어 ROUTES에 대해 이야기했습니다 그리고 우리는 여기에 ROUTE CONFIG가있어서 우리에게 사이트가 인식하는 여러 경로 정의 다음 폴더는 CONTROLLERS입니다

여기 사이트의 CONTROLLER 영역에 속한 모든 부서가 있습니다 이 대기열의 다음 폴더는 MODELS입니다 다음은 모델을 설명하는 부서입니다 그리고 마지막으로 여기에 VIEW를 설명하는 폴더가 있으며 여기에 사이트의 다른 페이지가 있습니다 우리가 먼저해야 할 일은 항상이 모델입니다

여기에 부서를 구축합니다 사이트에서 사용할 수있는 정보 설명 그럼 마우스 오른쪽 버튼을 클릭하자 클래스 추가 우리가 만든 첫 번째 클래스는 제품을 설명하는 부서입니다 PRODUCT라는 클래스를 만듭니다 PRODUCT에는 무엇이 있습니까? PRODUCT가 가지고 있다고 가정 해 봅시다

제품 이름 PRICE가 있으며 PRODUCT ID를 추가하겠습니다 따라서이 부서에서는 단일 제품 제품에 관한 순수한 정보만을 설명합니다 이 부서는 쌍극자로 정의된다는 점에 유의해야합니다 MODELS라는 네임 스페이스 MVC HELLO WORLD라는 네임 스페이스 내에 위치 우리가 연 프로젝트의 이름은? 우리는 물론이 네임 스페이스를 변경할 수 있습니다 이것은 보통 실제 프로젝트에서 수행되는 것입니다 전체 시스템이 작동하는 단일 네임 스페이스 그러나 클래스를 모델 폴더에 추가했기 때문에 그래서 우리는 시스템이 응용 프로그램 자체의 네임 스페이스 내에있는 네임 스페이스 모델을 만들었다는 것을 알 수 있습니다

우리는 현재 한 부서에서만 구축 된 모델을 완성한 후 다음으로 우리가 할 일은 컨트롤러를 만드는 것입니다 CONTROLLERS 폴더를 마우스 오른쪽 버튼으로 클릭하십시오 ADD CONTROLLER를 선택합니다 여기 우리는 CONTROLLER에 이름을 부여합니다 각 컨트롤러는 시스템의 다른 영역을 처리해야합니다

우리 시스템에 제품이 있다면 제품을 다루는 컨트롤러가 있어야하므로 제품 컨트롤러라고 부르 자 CONTROLLER 이름이 CONTROLLER로 끝나는 것이 중요합니다 현재 비어있는 MVC 컨트롤러를 사용 중입니다 내 말은, 시스템이 우리에게 모든 종류의 것을 추가하기를 원하지 않는다는 것입니다 우리가 현재 그들이 무엇인지 모르는 다른 것들 나중에 우리는 그것을 다룰 것입니다

추가 누르기 현재 제품과 관련된 모든 논리를 다루는 부서 인 CONTROLLER가 있습니다 CONTROLLER DEPARTMENT는 CONTROLLER 클래스를 상속하며 이것이 CONTROLLER가됩니다 Dippolet에서 우리는 INDEX라는 프린지가 있음을 알 수 있습니다 그녀는 가상 활동을 설명합니다 PRODUCT에 속한 CONTROLLER 중 INDEX 함수는 ACTION RESULT를 반환합니다

액션 결과는 VIEW를 볼 수있게 해줍니다 그리고 여기에 RETURN VIEW 함수가 있음을 알 수 있습니다 VIEW 실제로 이것은 우리가 곧 빌드 할 전망입니다 좋아요 VIEW를 만들자

VIEW를 보려면 매우 간단합니다 ADD VIEW 기능을 마우스 오른쪽 버튼으로 클릭하면됩니다 DIPOLET에서 VIEW의 이름은 CONTROLLER에있는 함수와 동일한 이름입니다 이제 VIEW를 추가하겠습니다 우리는 시스템에 세 가지 구성 요소가 있습니다 여기에 모델이 있다는 것을 알 수 있습니다

합계 여기 컨트롤러가 있음을 알 수 있습니다 누가 제품을 다룹니까? 그리고 INDEX라는 하나의 VIEW가 있음을 알 수 있습니다 그리고 VIEWS 폴더에있는 PRODUCTS 폴더에 있습니다 실제로 이것은 USER INTERFACE 시스템에있는 유일한 UI입니다 즉, 방금 만든 단일 페이지 모든 VIEW 페이지의 확장 CSHTML이 CSHTML은 왜입니까? 이 페이지 안에 있기 때문에 여기에 HTML 코드가 있습니다

그리고 우리는 C # 코드를 작성할 수 있습니다 RAIZOR 엔진으로 그의 목표입니다 서버 측에서 실행중인 코드 실행 궁극적으로 HTML을 클라이언트에만 반환하는 HTML을 생성합니다 따라서 현재 CONTROL F5에서 구축 한 사이트 만 실행하려면 사이트를 실행할 때 아무 것도 보지 않을 것입니다 왜냐하면 MVC에서 특정 페이지로 이동하지 않습니다

CONTROLLER에서 함수를 찾아야합니다 따라서 이것이 우리 사이트의 주소라면 슬래시를 등록 할 수 있습니다 CONTROLLER의 이름을 등록하십시오 CONTROLLERS 확장자가없는 CONTROLLER라는 단어가 없으면 그런 다음 슬래시와 탐색 할 함수의 이름 CONTROLLER 내에는 INDEX라는 함수가있었습니다 그래서 우리는 단지 함수의 이름을 등록 할 수 있습니다

ENTER를 눌러 VIEW를 얻었습니다 CONTROLLER가 우리에게 돌아갑니다 그가 쓴 모든 것은 INDEX입니다 보기 위해 잠시 시간을 들여 봅시다 그리고 그것은 VIEW 안에있는 것 같습니다

INDEX 이것은 쌍극자 활동을 설명하는 단어이므로 PRODUCT를 등록하고 ENTER를 누르더라도 INDEX라는 함수를 자동으로 찾습니다 URL 행에 작성한 모든 활동 이것은 ROUTES라는 주제로 나중에 우리가 얘기 할 것이고 여기서 정의 할 수있는 모든 것을 볼 것입니다 그러나 잠시 동안 우리는 CONTROLLER에서 VIEW로 아무 것도 전송하지 않았습니다 즉, 클라이언트가 CONTROLLER로 전송되었습니다 CONTROLLER 내에서 INDEX 기능으로 이동합니다

INDEX 함수가 VIEW를 생성했습니다 MVC가 자동으로 검색합니다 PRODUCT 폴더에있는 VIEW 우리가 CONTROLLER PRODUCT에 갔었 기 때문에 그리고이 폴더에서 VIEW 즉 페이지를 찾습니다 이름이 함수의 이름과 동일합니다 최종 고객이 미끄러 진 고객 실제로, 그는 그러한 기능을 발견한다

CONTROLLER에서 그가하는 일은 우리가 여기서 볼 수있는 객체를 만드는 것입니다 VIEW의 개체 VIEW에서 객체를 클라이언트에게 자동으로 반환하고 여기에있는 VIEW 안에있는 INDEX가 쓰여지는 전체 H2를 봅니다 CONTROLLER에서 VIEW로 정보를 이동하려고합니다 그래서 우리는 CONTROLLER에 갈 필요가 있습니다 그리고 VIEW를 다시 생성하기 전에 DATA-BASE에 액세스해야합니다 데이터베이스에 대한 액세스 데이터베이스에서 정보 가져 오기 객체를 생성하거나 DATA-BASE에서받은 정보에서 객체를 검색하려면 여기에서 정보를 VIEW로 이동하여 VIEW가 뷰에 정보를 통합합니다

우리는 현재 HELLO WORLD 프로젝트에 DATA-BASE로 가지 않고 있습니다 그러나 우리는이 오브젝트를 FLY에서 제작할 것입니다 아래에서 우리는 DATA-BASE로부터 데이터를 정확히 얻는 방법을 볼 것입니다 이제 우리가 할 일은 제품 부서에서 객체를 만드는 것입니다 더 정확하게 PRODUCT 제품 이름으로 채 웁니다

PRICE 제품 ID M에 주목해라 PRICE가 DECIMAL (으)로 설정되어 있기 때문에 그리고 45는 Double로 설정되고 M은 Debable에서 DECIMAL로 CASTING을 수행합니다 DECIMAL은 돈을 보유하도록 설계되었으며 M은 MONEY의 약자입니다