码迷,mamicode.com
首页 > 编程语言 > 详细

Type Erasure with Pokemon---swift的类型擦除

时间:2019-12-03 19:50:10      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:设计   blob   sel   box   add   cell   nbsp   class   机制   

我感觉这个是swift的设计缺陷。

 

类型擦除:解决泛型类型作为公用类型的问题

 

是抽象的公用机制的一种实现方式。

1)类型擦除并不能解决类型不一致的兼容问题,只能解决类似继承一致性的兼容问题。

2)擦除类型后的抽象类型,其类型信息仍然存在,只是需要保持逻辑一致性。

 

import Foundation

 

 

 

 

protocol Pokemon {

 

    associatedtype Power

 

    func attack() -> Power

 

}

 

 

 

 

struct Pikachu: Pokemon {

 

    func attack() -> ?? {

 

        return ??()

 

    }

 

}

 

 

 

 

struct Charmander: Pokemon {

 

    func attack() -> ?? {

 

        return ??()

 

    }

 

}

 

 

 

 

// power types

 

struct ?? { }

 

struct ?? { }

 

 

 

 

// MARK: - Abstract base class

 

class _AnyPokemonBase<Power>: Pokemon {

 

    init() {

 

        guard type(of: self) != _AnyPokemonBase.self else {

 

            fatalError("_AnyPokemonBase<Power> instances can not be created; create a subclass instance instead")

 

        }

 

    }

 

    func attack() -> Power {

 

        fatalError("Must override")

 

    }

 

}

 

// MARK: - Box container class

 

fileprivate final class _AnyPokemonBox<Base: Pokemon>: _AnyPokemonBase<Base.Power> {

 

    var base: Base

 

    init(_ base: Base) { self.base = base }

 

    fileprivate override func attack() -> Base.Power {

 

        return base.attack()

 

    }

 

}

 

// MARK: - AnyPokemon Wrapper

 

final class AnyPokemon<Power>: Pokemon {

 

    private let box: _AnyPokemonBase<Power>

 

    init<Base: Pokemon>(_ base: Base) where Base.Power == Power {

 

        box = _AnyPokemonBox(base)

 

    }

 

    func attack() -> Power {

 

        return box.attack()

 

    }

 

}

 

 

 

 

// Use AnyPokemon type directly

 

let pokemon: AnyPokemon = AnyPokemon(Pikachu())

 

pokemon.attack()

 

 

 

 

// Add a new electric Pokemon

 

class Jolteon: Eevee, Pokemon {

 

    func attack() -> ?? {

 

        return ??()

 

    }

 

}

 

class Eevee {}

 

 

 

 

// Iterate over a collection of Electric Pokemon

 

let electricPokemon = [AnyPokemon(Pikachu()), AnyPokemon(Jolteon())]

 

electricPokemon.map() { $0.attack() }

 

 

 

 

 

  1. class Pet { }
  2. class Dog: Pet { }
  3. class Cat: Pet { }
  4. // 1. 隐藏具体宠物类型信息
  5. let pets: [Pet] = [Dog(), Cat()]

 

https://github.com/bignerdranch/type-erasure-playgrounds/blob/master/playgrounds/Pokemon_erasure.playground/Contents.swift

Type Erasure with Pokemon---swift的类型擦除

标签:设计   blob   sel   box   add   cell   nbsp   class   机制   

原文地址:https://www.cnblogs.com/feng9exe/p/11978823.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!