Swift - один метод 2 класса - PullRequest
0 голосов
/ 22 мая 2018

Как в Swift применить один метод к 2 различным классам?

class Class1 {
      func doSomething() {
        self.doSomethingOnClass()
      }
}

   class Class2 {
      func doSomething() {
        self.doSomethingOnClass()
      }
}

, поэтому в основном то, что я хочу сделать вместо реализации одного и того же метода для каждого класса, я хочу извлечь метод, а затем попросить его обработатьЯ как Class1 или Class2.Я надеюсь, что протоколы могут сделать, но выглядит так, что если класс реализует протокол, то я все равно должен написать реализацию для каждого класса.Любой совет, что является лучшей практикой для достижения этой цели?Или просто лучше всего реализовать его в классе, даже если это означает дублирование кода.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Это можно сделать с помощью протоколов и расширений.Вот пример, сделанный с использованием игровых площадок.Вы можете скопировать и вставить этот код в игровую площадку, чтобы возиться с ним, если хотите, обратите внимание, что расширенный протокол обеспечивает реализацию по умолчанию как для классов, так и для структур.

//: Playground - noun: a place where people can play

import UIKit

protocol ClassProtocol {
    func classMethod()
}

extension ClassProtocol {
    func classMethod() {
        print("here i am")
    }
}

class Class1: ClassProtocol { }

class Class2: ClassProtocol { }

struct Struct1: ClassProtocol { }

Class1().classMethod()
Class2().classMethod()
Struct1().classMethod()

Вывод:

here i am
here i am
here i am

Что здесь происходит?Протокол определяет, что метод classMethod требуется в любом объекте или структуре, использующей протокол.Затем расширение обеспечивает реализацию по умолчанию для этого метода.При необходимости вы также можете переопределить эту реализацию по умолчанию.

struct Struct2: ClassProtocol {
    func classMethod() {
        print("this does something different")
    }
}

Struct2().classMethod()

Вывод:

this does something different
0 голосов
/ 22 мая 2018

Существуют два способа сделать это: наследование или протоколы.Swift определенно предпочитает последнее, и наследование определенно является плохим выбором, если задействована только одна функция.

Вот как это сделать с помощью протокола:

protocol CommonFunc: class {
    func doSomethingOnClass()
}

extension CommonFunc {
    func doSomethingOnClass() {
        print(type(of: self))
    }
}

class A: CommonFunc {

}

class B: CommonFunc {

}

A().doSomethingOnClass() // A
B().doSomethingOnClass() // B
...