小编Jea*_*non的帖子

如何将类类型作为函数参数传递

我有一个泛型函数调用Web服务并将JSON响应序列化回一个对象.

class func invokeService<T>(service: String, withParams params: Dictionary<String, String>, returningClass: AnyClass, completionHandler handler: ((T) -> ())) {

            /* Construct the URL, call the service and parse the response */
}
Run Code Online (Sandbox Code Playgroud)

我想要完成的是相当于这个Java代码

public <T> T invokeService(final String serviceURLSuffix, final Map<String, String> params,
                               final Class<T> classTypeToReturn) {
}
Run Code Online (Sandbox Code Playgroud)
  • 我的方法签名是我正在努力完成的吗?
  • 更具体地说,指定AnyClass作为参数类型正确的事情?
  • 在调用方法时,我将MyObject.self作为returnsClass值传递,但是我收到编译错误"无法将表达式的类型'()'转换为'String'"
CastDAO.invokeService("test", withParams: ["test" : "test"], returningClass: CityInfo.self) { cityInfo in /*...*/

}
Run Code Online (Sandbox Code Playgroud)

编辑:

我尝试使用object_getClass,如holex所提到的,但现在我得到:

错误:"类型'CityInfo.Type'不符合协议'AnyObject'"

需要做什么才能符合协议?

class CityInfo : NSObject {

    var cityName: String? …
Run Code Online (Sandbox Code Playgroud)

generics type-inference swift

136
推荐指数
3
解决办法
8万
查看次数

Objective-C类扩展

作为一个相当新的Objective-c程序员(具有4年的Java经验),我似乎很难理解何时使用类扩展.根据我的理解(如果我错了请纠正我),类别和扩展之间的主要区别在于扩展期望您在主实现中实现方法,而对于类别,它可以在另一个实现中.似乎人们主要使用扩展主要用于私有方法.

这是我的第一个问题.使用类扩展来声明私有方法,而不是完全声明它(在两种情况下似乎都在运行中编译)之间的区别是什么?(例1 vs 2)

例1

@interface Class()
-(void) bar;
@end

@implementation Class
-(void) foo {
    [self bar];
}

-(void) bar {
    NSLog(@"bar");
}
@end
Run Code Online (Sandbox Code Playgroud)

例2

@implementation Class
-(void) foo {
    [self bar];
}

-(void) bar {
    NSLog(@"bar");
}
@end
Run Code Online (Sandbox Code Playgroud)

第二个问题:在扩展中声明ivars并在实现中直接声明它之间有什么区别?(例3与4)

例3

@interface Class() {
    NSArray *mySortedArray;
}
@end

@implementation Class
@end
Run Code Online (Sandbox Code Playgroud)

例4

@implementation Class
NSArray *mySortedArray;
@end
Run Code Online (Sandbox Code Playgroud)

我有关于编码约定的最后一个问题:我应该何时在变量名称前放置下划线(_)?

谢谢

objective-c class-extensions

34
推荐指数
2
解决办法
3万
查看次数

NextJS - 将查询参数附加到动态路由

在我的 NextJS 应用程序中,我有一个在每个页面上都可见的语言选择器。当我选择一种新语言时,我只想通过lang=en向其附加查询参数来替换当前 URL 。

这是替换 URL 的函数:

const changeLanguage = (lang: LanguageID) => {
    replace({
      pathname,
      query: { ...query, lang },
    });
  };
Run Code Online (Sandbox Code Playgroud)

在本例中replacequerypathname来自下一个路由器。

现在,一切都适用于静态路由,但我无法使其适用于动态路由。例如,我有以下文件夹结构:

pages
|_customers
|__index.tsx
|__[customerId].tsx
Run Code Online (Sandbox Code Playgroud)

如果我打开http://localhost/customers并将我的语言更改为英语,则 URL 将更改为http://localhost/customers?lang=en我想要的。但是,如果我打开http://localhost/customer/1并将我的语言更改为英语,则 URL 将更改为http://localhost/customers/[customerId]?customerId=1&lang=en,而不是我期望的 URL http://localhost/customers/1?lang=en

现在,我知道我可以asPath在路由器上使用,并通过附加lang到它来重建查询字符串对象,但我觉得它应该构建到 Next.js 中。另外,我知道使用 vanilla JS 可以轻松完成,但这不是重点。

我错过了什么吗?是否有更简单的方法将查询参数附加到动态路由而不进行服务器端重新渲染?

谢谢

javascript reactjs next.js

5
推荐指数
5
解决办法
8954
查看次数