Ios 我如何在Swift中重新设计这个Objective-C战略模式?

Ios 我如何在Swift中重新设计这个Objective-C战略模式?,ios,swift,Ios,Swift,我看到了,但我对使用Swift设置相同的模式很好奇 在Swift中,我将如何做类似的事情?您的链接示例中没有任何内容不能直接转换为Swift: class Dog { var position: Int = 0 var strategy: DogStrategy init(strategy: DogStrategy) { self.strategy = strategy } func updatePosition() {

我看到了,但我对使用Swift设置相同的模式很好奇


在Swift中,我将如何做类似的事情?

您的链接示例中没有任何内容不能直接转换为Swift:

class Dog {
    var position: Int = 0
    var strategy: DogStrategy

    init(strategy: DogStrategy) {
        self.strategy = strategy
    }

    func updatePosition() {
        self.position = self.strategy.getNewPositionFromPosition(self.position)
    }
}

class DogStrategy {
    func getNewPositionFromPosition(position: Int) -> Int {
        return position + 2;
    }
}
尽管如此,我认为这是一个更好的实现,并作为一个协议加以说明(在Objective-C中也是可能的):


您的链接示例中没有任何内容不能直接转换为Swift:

class Dog {
    var position: Int = 0
    var strategy: DogStrategy

    init(strategy: DogStrategy) {
        self.strategy = strategy
    }

    func updatePosition() {
        self.position = self.strategy.getNewPositionFromPosition(self.position)
    }
}

class DogStrategy {
    func getNewPositionFromPosition(position: Int) -> Int {
        return position + 2;
    }
}
尽管如此,我认为这是一个更好的实现,并作为一个协议加以说明(在Objective-C中也是可能的):


您的链接示例中没有任何内容不能直接转换为Swift:

class Dog {
    var position: Int = 0
    var strategy: DogStrategy

    init(strategy: DogStrategy) {
        self.strategy = strategy
    }

    func updatePosition() {
        self.position = self.strategy.getNewPositionFromPosition(self.position)
    }
}

class DogStrategy {
    func getNewPositionFromPosition(position: Int) -> Int {
        return position + 2;
    }
}
尽管如此,我认为这是一个更好的实现,并作为一个协议加以说明(在Objective-C中也是可能的):


您的链接示例中没有任何内容不能直接转换为Swift:

class Dog {
    var position: Int = 0
    var strategy: DogStrategy

    init(strategy: DogStrategy) {
        self.strategy = strategy
    }

    func updatePosition() {
        self.position = self.strategy.getNewPositionFromPosition(self.position)
    }
}

class DogStrategy {
    func getNewPositionFromPosition(position: Int) -> Int {
        return position + 2;
    }
}
尽管如此,我认为这是一个更好的实现,并作为一个协议加以说明(在Objective-C中也是可能的):

(16个月后……)

drewag的答案是好的,工作也很好,但由于在Swift中,函数是一级公民,因此可以通过取消围绕策略定义的协议和类来简化答案。类型别名的使用是可选的,但有助于代码的自文档化

class Dog {
    var position: Int = 0
    var strategy: DogStrategy
    func updatePosition() {
        position = strategy(position)
    }
    init(strategy: DogStrategy) {
        self.strategy = strategy
    }
}

/// The strategy is implemented by any function that takes a position and returns another.
typealias Position = Int
typealias DogStrategy = (Position) -> Position

// Strategy one.
func slowDogStrategy(position: Position) -> Position {
    return position + 1;
}

// Strategy two,
func fastDogStrategy(position: Position) -> Position {
    return position + 5;
}

var fastDog = Dog(strategy: fastDogStrategy)
var slowDog = Dog(strategy: slowDogStrategy)
(16个月后……)

drewag的答案是好的,工作也很好,但由于在Swift中,函数是一级公民,因此可以通过取消围绕策略定义的协议和类来简化答案。类型别名的使用是可选的,但有助于代码的自文档化

class Dog {
    var position: Int = 0
    var strategy: DogStrategy
    func updatePosition() {
        position = strategy(position)
    }
    init(strategy: DogStrategy) {
        self.strategy = strategy
    }
}

/// The strategy is implemented by any function that takes a position and returns another.
typealias Position = Int
typealias DogStrategy = (Position) -> Position

// Strategy one.
func slowDogStrategy(position: Position) -> Position {
    return position + 1;
}

// Strategy two,
func fastDogStrategy(position: Position) -> Position {
    return position + 5;
}

var fastDog = Dog(strategy: fastDogStrategy)
var slowDog = Dog(strategy: slowDogStrategy)
(16个月后……)

drewag的答案是好的,工作也很好,但由于在Swift中,函数是一级公民,因此可以通过取消围绕策略定义的协议和类来简化答案。类型别名的使用是可选的,但有助于代码的自文档化

class Dog {
    var position: Int = 0
    var strategy: DogStrategy
    func updatePosition() {
        position = strategy(position)
    }
    init(strategy: DogStrategy) {
        self.strategy = strategy
    }
}

/// The strategy is implemented by any function that takes a position and returns another.
typealias Position = Int
typealias DogStrategy = (Position) -> Position

// Strategy one.
func slowDogStrategy(position: Position) -> Position {
    return position + 1;
}

// Strategy two,
func fastDogStrategy(position: Position) -> Position {
    return position + 5;
}

var fastDog = Dog(strategy: fastDogStrategy)
var slowDog = Dog(strategy: slowDogStrategy)
(16个月后……)

drewag的答案是好的,工作也很好,但由于在Swift中,函数是一级公民,因此可以通过取消围绕策略定义的协议和类来简化答案。类型别名的使用是可选的,但有助于代码的自文档化

class Dog {
    var position: Int = 0
    var strategy: DogStrategy
    func updatePosition() {
        position = strategy(position)
    }
    init(strategy: DogStrategy) {
        self.strategy = strategy
    }
}

/// The strategy is implemented by any function that takes a position and returns another.
typealias Position = Int
typealias DogStrategy = (Position) -> Position

// Strategy one.
func slowDogStrategy(position: Position) -> Position {
    return position + 1;
}

// Strategy two,
func fastDogStrategy(position: Position) -> Position {
    return position + 5;
}

var fastDog = Dog(strategy: fastDogStrategy)
var slowDog = Dog(strategy: slowDogStrategy)