devxoul / URLNavigator

⛵️ Elegant URL Routing for Swift
MIT License
3.25k stars 297 forks source link

Hi, I have a extension for URLNavigator, should add a link in this repo? #138

Closed cdoky closed 4 years ago

cdoky commented 4 years ago

https://github.com/philCc/URLNavigatorExt

Dependencies

Installation

URLNavigatorExt is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod 'URLNavigatorExt'
pod 'Sourcery'

Usage

let navigator = Navigator()

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // .... Router.registOuterUrl(jsonStr: Router.config, navigator: navigator) // .... return true }


- Viewcontroller
    - // sourcery: router: desc="这是页面描述"
    - // sourcery: router: name="这是页面名字"
    - // sourcery: router: path="这是页面的路径 eg: /mine/profile"
    - // sourcery: router: parameter="参数名称:参数类型(自定义类型或数组,需要实现`Typeible`协议):默认值"
`注意:`ViewController 必须实现`Navigatorible`协议
```swift
// sourcery: router: desc="第一个viewController"
// sourcery: router: name="home_page"
// sourcery: router: path="/home"
// sourcery: router: parameter="type:TestEnum:.a"
// sourcery: router: parameter="type1:TestEnum?:.b"
// sourcery: router: parameter="p3:String?:abc123"
// sourcery: router: parameter="p4:String?"
// sourcery: router: parameter="p5:Test2Enum?:.c"
// sourcery: router: parameter="p6:Test2Enum:.d"
// sourcery: router: parameter="p7:Int64"
// sourcery: router: parameter="blk:(()->Void)?"
class ViewController: UIViewController, Navigatorible {
    var navigator: NavigatorType!
    var parameter: Router.PRHome_page?
    required init(navigator: NavigatorType, parameterible: Parameterible?) {
        super.init(nibName: nil, bundle: nil)
        self.parameter = parameterible as? Router.PRHome_page
    }

    // ...
}

/// output
/*
    /// desc: 第一个viewController
    /// view: ViewController
    /// parameters:
    ///     - blk: (()->Void)? 
    ///     - p7: Int64 
    ///     - p6: Test2Enum default: .d
    ///         - c: 100
    ///         - d: 101
    ///     - p5: Test2Enum? default: .c
    ///         - c: 100
    ///         - d: 101
    ///     - p4: String? 
    ///     - p3: String? default: abc123
    ///     - type1: TestEnum? default: .b
    ///         - a: a
    ///         - b: b
    ///     - type: TestEnum default: .a
    ///         - a: a
    ///         - b: b
    public static let home_page = "\(Scheme.domain)/home"

    /// desc: 第一个viewController
    /// view: ViewController
    /// path: /home
    /// name: home_page
    public struct PRHome_page: Parameterible {
        var blk: (()->Void)?
        var p7: Int64
        var p6: Test2Enum
        var p5: Test2Enum?
        var p4: String?
        var p3: String?
        var type1: TestEnum?
        var type: TestEnum

        init(
            type: TestEnum,
            p6: Test2Enum,
            p7: Int64,
            type1: TestEnum?  = nil,
            p3: String?  = nil,
            p4: String?  = nil,
            p5: Test2Enum?  = nil,
            blk: (()->Void)?  = nil
        ) {
            self.blk = blk
            self.p7 = p7
            self.p6 = p6
            self.p5 = p5
            self.p4 = p4
            self.p3 = p3
            self.type1 = type1
            self.type = type
        }

        public static func instance(by queryItem: [String: String]) -> Self? {
            let items = queryItem.map({ ($0.key.lowercased(), $0.value) })
            let dict = [String: String](uniqueKeysWithValues: items)
            var _type: TestEnum? = .a
            if let value = dict["type"]{
                if let _enum = TestEnum(rawValue: value) {
                    _type = _enum
                }
            }
            var _p6: Test2Enum? = .d
            if let value = dict["p6"]{
                if let _value = Int(value), let _enum = Test2Enum(rawValue: _value) {
                    _p6 = _enum
                }
            }
            var _p7: Int64? = nil
            if let value = dict["p7"]{
                _p7 = Int64(value)
            }
            var type1: TestEnum? = .b
            if let value = dict["type1"]{
                if let _enum = TestEnum(rawValue: value) {
                    type1 = _enum
                }
            }
            var p3: String? = "abc123"
            if let value = dict["p3"]{
                p3 = value
            }
            var p4: String? = ""
            if let value = dict["p4"]{
                p4 = value
            }
            var p5: Test2Enum? = .c
            if let value = dict["p5"]{
                if let _value = Int(value), let _enum = Test2Enum(rawValue: _value) {
                    p5 = _enum
                }
            }
            guard 
                let type = _type,
                let p6 = _p6,
                let p7 = _p7
            else { return nil}
            return PRHome_page(
                type: type,
                p6: p6,
                p7: p7,
                type1: type1,
                p3: p3,
                p4: p4,
                p5: p5,
                blk: nil
            )
        }
    }
*/

// or self.navigator.push("(Router.home_page)?type=a&type1=b&p7=1")