标签: anyobject

Swift中仅限类的泛型约束

我试图将泛型类型的变量标记为弱:

class X<T> {
  weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)

如果我没有提出任何约束T我得到错误weak cannot be applied to non-class type 'T'.

如果我只使用这个与NSObject派生类,这将工作:

class X<T: NSObject> {
  weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)

但我也希望能够使用纯Swift类.

对于协议,可以通过使用class关键字要求实现者具有类类型:

protocol ClassType: class {
}
Run Code Online (Sandbox Code Playgroud)

根据ClassType协议,我现在可以将变量标记为弱:

class X<T: ClassType> {
  weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)

但我不能class直接将关键字添加到泛型参数:

class X<T: class> { // Compile error
  weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)

我可以使协议解决方案适用于具有扩展名的所有NSObject派生类:

extension NSObject: ClassType {
}
Run Code Online (Sandbox Code Playgroud)

但是对于纯Swift类,我没有可以添加此扩展的常见超类.有没有办法让这项工作没有将ClassType协议添加到我想要使用X该类的每个类?例如,泛型参数的一些特殊限定符如class X<T:ThisIsAClass> …

generics protocols class swift anyobject

21
推荐指数
1
解决办法
3801
查看次数

Swift AnyObject的下标,它来自哪里?

在Swift中,它是如何AnyObject支持下标的,即使对于不可下载的类型也是如此?例:

let numbers: AnyObject = [11, 22, 33]
numbers[0]       // returns 11

let prices: AnyObject = ["Bread": 3.49, "Pencil": 0.5]
prices["Bread"]  // returns 3.49

let number: AnyObject = 5
number[0]        // return nil

let number: AnyObject = Int(5)
number[0]        // return nil
Run Code Online (Sandbox Code Playgroud)

然而,如果我number被声明为Int那么这是一个语法错误:

let number: Int = 5
number[0]        // won't compile
Run Code Online (Sandbox Code Playgroud)

有趣的是,Any没有下标支持.

swift anyobject

15
推荐指数
2
解决办法
695
查看次数

输入任何?没有下标成员

我想从个人资料字典中获取地址,但我收到错误"输入任何内容?没有下标成员"

var address:[[String : Any]] = [["Address": "someLocation", "City": "ABC","Zip" : 123],["Address": "someLocation", "City": "DEF","Zip" : 456]]
var profile:[String : Any] = ["Name": "Mir", "Age": 10, "Addresses": address]
profile["Addresses"][0]     <-----------------type any? has no subscript members
Run Code Online (Sandbox Code Playgroud)

我该如何解决并获取地址?非常感谢.

arrays dictionary any swift anyobject

14
推荐指数
1
解决办法
4万
查看次数

swift 3 - ios:将anyObject转换为字符串

我们如何在swift 3中将anyobject转换为字符串,在旧版本中使用它非常容易.

var str = toString(AnyObject)
Run Code Online (Sandbox Code Playgroud)

我试过String(AnyObject)但输出总是可选的,即使我确定AnyObject不是可选值.

string ios swift anyobject

14
推荐指数
3
解决办法
4万
查看次数

AnyObject如何符合NSObjectProtocol?

这个问题的灵感来自mz2关于检查对象类型失败并且"不是类型"错误的问题的答案.

考虑一个空的Swift类:

class MyClass { }
Run Code Online (Sandbox Code Playgroud)

试图NSObjectProtocol在此类的实例上调用任何方法将导致编译时错误:

let obj = MyClass()
obj.isKindOfClass(MyClass.self) // Error: Value of type 'MyClass' has no member 'isKindOfClass'
Run Code Online (Sandbox Code Playgroud)

但是,如果我将实例转换为AnyObject,我的对象现在符合NSObjectProtocol,我可以调用协议定义的实例方法:

let obj: AnyObject = MyClass()
obj.isKindOfClass(MyClass.self) // true
obj.conformsToProtocol(NSObjectProtocol) // true
obj.isKindOfClass(NSObject.self) // false
Run Code Online (Sandbox Code Playgroud)

我的对象不继承NSObject,但仍然符合NSObjectProtocol.怎么AnyObject符合NSObjectProtocol

nsobject swift swift-protocols anyobject

9
推荐指数
2
解决办法
1675
查看次数

AnyObject vs. Struct(Any)

我想为我的项目创建一个这样的方法:

func print(obj: AnyObject) {
    if let rect = obj as? CGRect {
        println(NSStringFromCGRect(rect))
    }
    else if let size = obj as? CGSize {
        println(NSStringFromCGSize(size))
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

但我不能因为CGRectCGSizestructS和不符合AnyObject protocol.那么,关于如何做到这一点的任何想法?

struct any ios swift anyobject

8
推荐指数
2
解决办法
2392
查看次数

检查选项时使用的"AnyObject"类型的非可选表达式

我在'Dictionary'上创建了一个扩展来帮助我解析JSON.下面的方法帮助我这样做:

func toJSONString() -> String? {
    if let dict = self as? AnyObject {
        if let data = try? JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions(rawValue: 0)) {
            if let json = String(data: data, encoding: String.Encoding.utf8) {
                return json
            }
        }
    }
    return nil
}
Run Code Online (Sandbox Code Playgroud)

问题出现在这一行:

if let dict = self as? AnyObject {
Run Code Online (Sandbox Code Playgroud)

我收到一条警告,说"检查选项时使用的'AnyObject'类型的非可选表达式"

我该如何解决这个问题?

dictionary ios swift anyobject

8
推荐指数
1
解决办法
8482
查看次数

为什么当在Array中放置多个类型项时,Swift不会对Any进行类型推断

有两种情况让我在使用Xcode 7.1开发swift 2.2时感到困惑,请看下面的例子,谢谢

首先,当导入Foundation时,我声明了一个testArray,它包含两个项目,一个Integer类型1和一个String类型"hello",我的问题是为什么Swift类型推断testArray到Array(NSObject)而不是Array(Any)

import Foundation
let testArray = [1, "hello"] 
print(testArray.dynamicType) //testArray is Array<NSObject>
Run Code Online (Sandbox Code Playgroud)

其次,当我删除import Foundation时,下面的代码无法编译,错误信息是"表达式的类型没有更多内容",我的问题是为什么Swift在这种情况下没有对Array(Any)进行类型推断,谢谢求助

let testArray2 = [2, "world"]
print(testArray2) 
//can't compile, error message = "Type of expression is ambiguous without more content"
Run Code Online (Sandbox Code Playgroud)

arrays types type-inference swift anyobject

7
推荐指数
1
解决办法
412
查看次数

从AnyObject转换为CGColor?没有错误或警告

你好StackOverflow :)

自从升级到Swift 2.0以来,我一直遇到一个奇怪的问题

我正在尝试设置边框颜色,所以我正在写self.layer.borderColor = borderColor as! CGColorborderColor是一个AnyObject,而self.layer.borderColor是一个CGColor?

如果我写self.layer.borderColor = borderColor as! CGColor我得到警告

将强制向下转换为“ CGColor”作为可选选项将永远不会产生“ nil”

并建议改为使用 as?

如果我改写self.layer.borderColor = borderColor as? CGColor我会得到错误

有条件地向下转换为CoreFoundation类型“ CGColor”将始终成功

为了确保我没有丢失我也尝试写的东西container.layer.borderColor = borderColor as CGColorcontainer.layer.borderColor = borderColor这两个都给出了以下错误:

'AnyObject'不能转换为'CGColor';您是要使用“ as!”吗?强迫垂头丧气?

仅在使用时使用XCode给出的警告运行as!并不十分糟糕,但我希望保持我的代码警告自由。我真的很需要您的帮助。这是我不了解的东西,还是我应该报告的Swift 2.0中的错误。

干杯!

雅各布

casting compiler-warnings cgcolor ios anyobject

6
推荐指数
2
解决办法
2018
查看次数

引用类型到 AnyObject 类型的泛型约束的协议

我有一个通用结构声明如下:

struct WeakReference<T: AnyObject> {
    weak var value: T?

    init(value: T?) {
        self.value = value
    }
}
Run Code Online (Sandbox Code Playgroud)

和一个协议:

protocol SomeProtocol: class {

}
Run Code Online (Sandbox Code Playgroud)

但我无法声明 类型的变量WeakReference<SomeProtocol>,编译器抱怨说

“WeakReference”要求是SomeProtocol类类型

有趣的是,在 Swift 中,class是 AnyObject 的类型别名。

我实际上想保存一个数组,WeakReference<SomeProtocol>因为该数组保存强引用。

Swift 中的仅类泛型约束是一个类似的问题,但并没有真正解决这个问题。

我们如何传递SomeProtocolto WeakReference

编辑: 以下场景编译良好,但我们失去了保存弱引用的能力:

struct Reference<T> {
    var value: T?

    init(value: T?) {
        self.value = value
    }
}

var array: [Reference<SomeProtocol>] = []
Run Code Online (Sandbox Code Playgroud)

generics protocols class swift anyobject

6
推荐指数
1
解决办法
1284
查看次数