스위프트 얼굴 질문

기사에서 재판 : http://www.pythonheidong.com/blog/article/2188/

요구 1 개 어레이는 어레이에서 두 개의 스위칭 소자를 함수를 작성
  • 두 X 프로그래머 :
    좋은 간단한 아, 직접 쓰기 다음과 같은 결과
func swap(_ nums: inout [Int], _ p: Int, _ q: Int) {
    let temp = nums[p]
    nums[p] = nums[q]
    nums[q] = temp 
}
  • 일반 프로그래머 :
    첫째, 인터뷰, 배열의 유형과 통신? 면접관은 임의 말할 것이다. 평균 프로그래머 미소는, 다음과 같은 코드를 작성
func swap<T>(_ nums: inout [T], _ p: Int, _ q: Int) {
    let temp = nums[p]
    nums[p] = nums[q]
    nums[q] = temp 
}
  • 예술 프로그래머 :
    면접관, 배열의 유형과 통신? 어떤 다른 요구 사항 및 제한? 면접관이는 스위프트 인터뷰 질문이라고 말할 것입니다. 예술 프로그래머가 힌트를 가지고, 다음에 답을 쓰기
func swap<T>(_ nums: inout [T], _ p: Int, _ q: Int) {
    (nums[p], nums[q]) = (nums[q], nums[p])
}

해당 테스트에 쓰여진 위의 코드는 다양한 경계 경우를 감지 한 다음 확인 후, 말하는 동안,이 질문에 나는 끝났어요.
이 질문은 사실, 프로그래머 검토, 통신, 인식과 테스트를 조사, 간단한 것처럼 보일 수 있습니다. 스위프트는 기술적으로 제네릭 및 튜플의 성격을 조사했다.

2. 아래의 코드에 어떤 문제가 있습니까
public class Node {
  public var value: Int
  public var prev: Node?
  public var post: Node?

  public init(_ value: Int) {
    self.value = value
  }
}

답 : 그것은 약으로 또는 VAR 이전 var에 포스트의 전면에 결합되어야한다.
그 이유는 표면에, 위의 코드 문제없이. 하지만 문제가 나오면이 쓰기 :

let head = Node(0)
let tail = Node(1)
head.post = tail
tail.prev = head

서로이 경우, 헤드 및 테일 포인트 (사이클을 유지) 원형 기준을 형성한다.

3.이 기능을 달성하기 위해, 입력은 임의의 정수, 출력 + 2를 반환하는 정수 입력된다

많은 사람들이 와서이 질문에 쓰기 :

func addTwo(_ num: Int) -> Int {
    return num + 2
}

그리고 면접관은 내가 원하는 경우 4를 +를 달성하는 것을 말할 것이다? 프로그래머는 잠시 생각하지만, 또 다른 방법은 정의한다 :

func addFour(_ num: Int) -> Int {
    return num + 4
}

내가 돌아 + 6 + 8을 운영 달성하고자하는 경우, 면접관이 물어 것인가? 당신은 그렇게 할 수있는 한 번만 방법을 정의 할 수 없습니다? 올바른 표현은 스위프트 코시 기능을 사용하는 것입니다 :

func add(_ num: Int) -> (Int) -> Int {
  return { val in
    return num + val
  }
}

let addTwo = add(2), addFour = add(4), addSix = add(6), addEight = add(8)

 

4. 다음 코드는 간소화
func divide(dividend: Double?, by divisor: Double?) -> Double? { 
  if dividend == nil { 
    return nil 
  }  
  if divisor == nil { 
    return nil 
  } 
  if divisor == 0 { 
    return nil
  }  
  return dividend! / divisor!
}

이 질문은 조사 guard let제표 및 옵션 체인을, 가장 좋은 대답은

func divide(dividend: Double?, by divisor: Double?) -> Double? { 
    guard let dividend = dividend, let divisor = divisor, divisor != 0 else {
        return nil
    }

    return dividend / divisor
}

 

5. 다음 함수는 밖으로 무엇을 인쇄 할 것인가?
var car = "Benz" 
let closure = { [car] in 
  print("I drive \(car)")
} 
car = "Tesla" 
closure()

clousre 이미 복사를 언급하기 때문에 자동차 ([자동차]), 차에이 시간 clousre이 아닌 외부 차량에 관련된 로컬 변수, 그것은 인쇄됩니다 "나는 벤츠를 운전"에 갔다.
이 때, 면접관은 다음과 같이 제목을 약간 수정, 미소를 지었다 :

var car = "Benz" 
let closure = {
  print("I drive \(car)")
} 
car = "Tesla" 
closure()

이 폐쇄 자동차 또는 글로벌 변수에 의해 중복 된 자동차의 사본, 그래서 clousre를 선언하지 않은에서, 다음 "나는 테슬라 드라이브"인쇄한다

6. 다음 코드는 무엇을 인쇄 할 것인가?
protocol Pizzeria { 
  func makePizza(_ ingredients: [String])
  func makeMargherita()
} 

extension Pizzeria { 
  func makeMargherita() { 
    return makePizza(["tomato", "mozzarella"]) 
  }
}

struct Lombardis: Pizzeria { 
  func makePizza(_ ingredients: [String]) { 
    print(ingredients)
  } 
  func makeMargherita() {
    return makePizza(["tomato", "basil", "mozzarella"]) 
  }
}

let lombardis1: Pizzeria = Lombardis()
let lombardis2: Lombardis = Lombardis() 
lombardis1.makeMargherita()
lombardis2.makeMargherita()

답변 : 다음 두 줄에서 인쇄
[ "토마토", "바질", "모짜렐라"]
[ "토마토", "바질", "모짜렐라을"]

코드 Lombardis에서 makeMargherita 그렇게 전화를 결코 코드를 다시 작성 그것은 makeMargherita에서 Lombardis입니다.
또한, 우리는 FUNC makeMargherita의 프로토콜 피자는 () 코드가됩니다 삭제

protocol Pizzeria {
  func makePizza(_ ingredients: [String])
}

extension Pizzeria {
  func makeMargherita() {
    return makePizza(["tomato", "mozzarella"])
  }
}

struct Lombardis: Pizzeria {
  func makePizza(_ ingredients: [String]) {
    print(ingredients)
  }
  func makeMargherita() {
    return makePizza(["tomato", "basil", "mozzarella"])
  }
}

let lombardis1: Pizzeria = Lombardis()
let lombardis2: Lombardis = Lombardis()
lombardis1.makeMargherita()
lombardis2.makeMargherita()

이 시간 밖으로 인쇄 다음과 같은 결과를 :
[ "토마토", "모짜렐라"]
[ "토마토", "바질", "모짜렐라"]

makeMargherita는 () 우리는 기본 구현을 호출 기본 구현을 가지고있는 동안 lombardis1는, 피자 때문이다.

제 스위프트 정의 된 상수와 상수 오브젝티브 C 차이가 무엇으로 정의?

쓰기는 다른 나올 것으로 보이지 않기 때문에 대부분의 사람들은 차이를 느낄 수 없습니다.
OC는 정수로 정의된다 :

const int number = 0;

스위프트는 정의 된 상수입니다 :

let number = 0

우선, 제 구별 OC 일정한 CONST로 표시하고 신속한 결정하는데 사용하도록하는 일정하지 않다.
또한 상기 구별 OC의 CONST 상수의 형태로 표시하고 값은 컴파일 시간에 결정되고, 그러나 단지 유형 및 값이 정적 일 수있다 (단 한 번에 할당 될 수있다) 상수 스위프트 도시 내버려 또는 수도 동적 계산 방법, 그들은되는 런타임 결정된 시간.

8. 차이가 무엇인지에 신속한 구조체와 클래스? 응용 프로그램의 예

형 구조체의 값이, 클래스 참조 형식이다.
WWDC 사람들이 알고 볼, 구조체는 멀티 스레드 및 네트워크 요청에 특히 유용, 작은 클래스 모델 이전보다 더 안전하고 데이터를 복사하기 때문에 애플이 좋습니다. 간단한 예를 살펴 보자 :

class A {
  var val = 1
}

var a = A()
var b = a
b.val = 2

이때, 발은 2로 변경하고, A 및 B는 동일한 메모리 성질을 가리 참조 타입과 같다. 이 문제에 대한 해결책은 구조체를 사용하는 것입니다 :

struct A {
  var val = 1
}

var a = A()
var b = a
b.val = 2

이 때, 구조체는, A 및 B는 다른 것들 값 유형은 B의 변화에 ​​영향이 없을 것이다.

결국 9 스위프트 기능 객체 지향 프로그래밍 언어 아직도?

스위프트는 객체 지향뿐만 아니라, 기능적인 프로그래밍 언어 모두이다.
그는 이러한 관점에서 신속한 지원 패키지 클래스, 상속, 다형성은 순수 객체 지향 자바 언어와 거의 차이가 없기 때문에 스위프트, 객체 지향 말했다.
신속한 지원 맵이 감소하기 때문에 스위프트, 필터 등의 중간 상태 flatmap 제거 수학적 기능적 접근 결과보다는 중앙 연산 처리에 더 많은 강조 함수 프로그래밍 언어 인 것을 특징으로하는 방법.


기사에서 재판 : http://www.pythonheidong.com/blog/article/2188/

추천

출처www.cnblogs.com/xiongbatianxiaskjdskjdksjdskdtuti/p/11350053.html